假设我有以下不完整的代码:
public class Foo<Type> {
public Foo() {
List<Type> list = new ArrayList|
}
}
其中ArrayList
后面的竖线(“|”)表示当前光标位置。
现在,如果我按 Ctrl+Space 并让 Eclipse 自动完成 ArrayList
上的构造函数调用,它会生成以下行:
List<Type> list = new ArrayList<Foo.Type>();
并立即报告错误“Foo.Type无法解析为类型”。
这给我留下了几个问题:
为什么 Eclipse 在自动完成的通用参数中包含 Foo.
?这是一个错误吗?它这样做有原因吗?可以关掉吗?最后:为什么 Foo.Type
无法解析???
最佳答案
我至少可以部分回答你的问题。第一个,简单的。 Foo.Type
无法解析,因为这将是一个名为 Type
的内部类里面Foo
类(class)。在您的示例中,没有这样的内部类。另外,在您的代码中,符号 Type
实际上是一个通用类型变量,既不是名称也不是对任何特定类的引用。这很容易重现,如 DrJava 中所示,并不特定于您对 Eclipse 的使用:
“为什么 Eclipse 包含 Foo.
”和“这是一个错误吗?”我认为答案显然是是的,这是一个错误,只是因为不存在 Foo.Type
这样的东西。在您发布的代码中以及编译器的报告中。但作为一个错误,如果不研究 Eclipse 代码或 Eclipse 依赖于其自动完成逻辑的任何代码,就很难回答问题的为什么部分。 Eclipse 应该为您推荐的只是 Type
。 DrJava 再次表明使用 <Type>
按预期干净地编译:
至于关闭此行为,由于我不是 Eclipse 用户,目前我能做的最好的就是引导您到这个相关的 SO 问题:Disable content assist in Eclipse
虽然我不知道 Eclipse 是否实际上依赖编译器类型推断来提供自动完成建议,但多年来出现了许多 javac 编译器推断错误,以及 Eclipse 行为与 javac 不匹配的报告。其中一些是 javac bug,其他可能是 Eclipse 问题。在网络上搜索“java type inference bug”会得到大量结果,但目前这只是猜测。您没有指定您使用的是哪个版本的 Java;使用不同版本(JDK 6 vs 7 vs 8)尝试相同的代码可能会很有趣。
关于java - Eclipse content-assist 建议 <classname>.<parameter> 作为通用参数并报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23370582/