假设我有以下不完整的代码:
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
无法解决?
答案 0 :(得分:1)
我至少可以部分回答你的问题。首先,简单的一个。 Foo.Type
无法解析,因为这将是Type
类中名为Foo
的内部类。在你的例子中,没有这样的内部类。此外,在您的代码中,符号Type
实际上是泛型类型变量,既不是名称也不是对任何特定类的引用。这很容易重现,如DrJava所示,并不特定于您使用Eclipse:
&#34;为什么Eclipse包含Foo.
&#34;和&#34;这是一个错误吗?&#34;我认为答案显然是是的,这是一个错误,只是因为在您发布的代码中没有Foo.Type
这样的东西,并且正如编译器所报告的那样。但是作为一个错误,如果不查看Eclipse代码或Eclipse依赖于其自动完成逻辑的任何代码,就很难回答为什么部分问题。 Eclipse 应为您推荐的内容只是Type
。同样,DrJava显示使用<Type>
按预期干净地编译:
至于关闭这种行为,因为我不是Eclipse用户,我现在能做的最好的事情就是引导你进入这个相关的SO问题:Disable content assist in Eclipse
虽然我不知道Eclipse是否真的依赖于编译器类型推断来提供自动完成建议,但多年来已经出现了许多javac编译器推断错误,以及Eclipse行为与javac不匹配的报告。其中一些是javac错误,其他可能是Eclipse问题。在Web上搜索&#34; java类型推断错误&#34;产生大量的点击量,但在这一点上,它只是一个猜测。您没有指定您使用的Java版本;尝试使用不同版本的相同代码(JDK 6 vs 7 vs 8)可能会很有趣。