redhat-developer / redhat-developer/vscode-java
Java type inference fails with this program
还没有人认领这个 Issue。
- 主要语言
- TypeScript
- 星标
- 2.3k
- 派生
- 546
- 平均合并
- 20 小时 1 分钟
- 30 天内合并 PR
- 11
描述
Environment
- Operating System: macOS Sonoma
- JDK version: 21
- Visual Studio Code version: 1.90.2
- Java extension version: 1.31.0
Steps To Reproduce
Create a file Main.java, paste the following content into it and then open it with VS Code and the Java extension:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
record Foo(String id, List<Bar> bars) {}
record Bar(String id) {}
public static void main(String[] args) {
var barsByFooIdAndBarId = Collections.<Foo>emptyList()
.stream()
.collect(
Collectors.toMap(
Foo::id,
foo ->
Collections.<String, Bar>emptyMap()
.entrySet()
.stream()
.collect(
Collectors.toMap(
Map.Entry::getKey,
entry ->
foo
.bars()
.get(0)
)
)
)
);
Bar bar = barsByFooIdAndBarId
.computeIfAbsent("fooId", id -> Collections.emptyMap())
.get("barId");
System.out.println(bar);
}
}
Current Result
The program doesn't compile. barsByFooIdAndBarId's type is inferred as Map<String, Map<String, Object>> instead of Map<String, Map<String, Bar>>. As a result, the assignment to Bar bar is invalid because Object is not assignable to Bar. However, if you replace var with Map<String, Map<String, Bar>> directly, then the program will be just fine. You can even run it and it will print null.
I know that this doesn't happen with javac nor IntelliJ because I noticed this at work and my colleagues using IntelliJ don't have the issue and manual compilation with Maven is also fine.
I suspect that the issue comes from the Eclipse Java language server which the Java extension is based on. But I cannot confirm this for now as I'm still trying to build and run the language server locally. And this is harder than I thought.
Expected Result
The program compiles and runs with VS Code and the Java extension. I understand that this may not be easy to solve. I would already appreciate some insights on the issue. If you think that I should open an issue on Eclipse's side, please let me know!
Additional Informations
Last but not least, thank you for your amazing work! 💪 I'm so happy to be able to write Java in VS Code thanks to the extension. I was able to move away from IntelliJ which I genuinely dislike. So thank you so much for the dedication in making this possible! ❤️
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
在 VS Code 1.90.2 中使用 Java extension 1.31.0 和 JDK 21,通过提供的 Main.java 程序重现推断失败。首先调查 Eclipse Java language server,然后验证 barsByFooIdAndBarId 被推断为 Map<String, Map<String, Bar>>,并且程序能够按预期编译和运行。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- java
- 领域
- devtools
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 32/100