Eclipse内容辅助为泛型参数建议<classname>。<parameter>并报告错误</parameter> </classname>

时间:2014-04-29 16:45:26

标签: java eclipse generics content-assist

假设我有以下不完整的代码:

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无法解决?

1 个答案:

答案 0 :(得分:1)

我至少可以部分回答你的问题。首先,简单的一个。 Foo.Type无法解析,因为这将是Type类中名为Foo内部类。在你的例子中,没有这样的内部类。此外,在您的代码中,符号Type实际上是泛型类型变量,既不是名称也不是对任何特定类的引用。这很容易重现,如DrJava所示,并不特定于您使用Eclipse: Screenshot from DrJava showing compiler error referencing Foo.Type

&#34;为什么Eclipse包含Foo.&#34;和&#34;这是一个错误吗?&#34;我认为答案显然是是的,这是一个错误,只是因为在您发布的代码中没有Foo.Type这样的东西,并且正如编译器所报告的那样。但是作为一个错误,如果不查看Eclipse代码或Eclipse依赖于其自动完成逻辑的任何代码,就很难回答为什么部分问题。 Eclipse 为您推荐的内容只是Type。同样,DrJava显示使用<Type>按预期干净地编译:

Screenshot from DrJava showing a clean compilation when referencing Type without any qualifier in front of it.

至于关闭这种行为,因为我不是Eclipse用户,我现在能做的最好的事情就是引导你进入这个相关的SO问题:Disable content assist in Eclipse

虽然我不知道Eclipse是否真的依赖于编译器类型推断来提供自动完成建议,但多年来已经出现了许多javac编译器推断错误,以及Eclipse行为与javac不匹配的报告。其中一些是javac错误,其他可能是Eclipse问题。在Web上搜索&#34; java类型推断错误&#34;产生大量的点击量,但在这一点上,它只是一个猜测。您没有指定您使用的Java版本;尝试使用不同版本的相同代码(JDK 6 vs 7 vs 8)可能会很有趣。