java - Eclipse content-assist 建议 <classname>.<parameter> 作为通用参数并报告错误

标签 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 无法解析???

最佳答案

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

“为什么 Eclipse 包含 Foo.”和“这是一个错误吗?”我认为答案显然是是的,这是一个错误,只是因为不存在 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 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/

相关文章:

Java单例类和多线程

java - 如何知道连接两点的线?

java - 制作不可变的 Java 对象

android - java.lang.NoClassDefFoundError 异常

javascript - 如何在 JSP 编辑器中激活 javascript 的语法着色 - Eclipse

java - Spring Controller /服务/存储库中的泛型

java - <> 对 java 泛型意味着什么?

java - 如何为具有 Java Spring 安全性的用户授予权限

eclipse - Tomcat 不显示 Eclipse 项目

java - 填充数组的对象列表 asList 无法编译需要可序列化列表