【问题标题】:Eclipse content-assist suggests <classname>.<parameter> for generic parameter and reports errorEclipse content-assist 建议 <classname>.<parameter> 作为通用参数并报告错误
【发布时间】:2014-05-18 07:33:17
【问题描述】:

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

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 cannot be resolve to a type”。

这给我留下了几个问题:

为什么 Eclipse 在自动完成的泛型参数中包含 Foo.?这是一个错误吗?这样做有什么原因吗?可以关闭吗?最后:为什么Foo.Type不能解决???

【问题讨论】:

  • 通常泛型类型变量使用单个字母,例如&lt;T&gt; 而不是 &lt;Type&gt;,因为第二种形式看起来像是在引用一个名为 Type 的实际类。 Eclipse 可能有一个错误,并且在这种情况下会因为这个原因而感到困惑。如果改为&lt;T&gt;,问题会消失吗?
  • @WilliamPrice 有趣的想法。不幸的是,将其更改为 T 并不能解决问题。也许我会将它报告给 Eclipse 错误跟踪器。他们可能有解决方案或意见。

标签: java eclipse generics content-assist


【解决方案1】:

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

“为什么 Eclipse 包含 Foo.”和“这是一个错误吗?”我认为答案显然是是的,这是一个错误,仅仅是因为在您发布的代码中以及编译器报告的情况下,没有 Foo.Type 这样的东西。但作为一个错误,如果不查看 Eclipse 代码或 Eclipse 依赖其自动完成逻辑的任何代码,就很难回答您问题的 why 部分。 Eclipse应该向您推荐的只是Type。再一次,DrJava 表明使用 &lt;Type&gt; 可以像预期的那样干净地编译:

至于关闭此行为,因为我不是 Eclipse 用户,目前我能做的最好的就是将您引导至这个相关的 SO 问题:Disable content assist in Eclipse

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

【讨论】:

  • 您解释为什么无法解决Foo.Type 是有道理的。而且我也认为这可能是一个bug,所以我向Eclipse团队提交了一份报告:bugs.eclipse.org/bugs/show_bug.cgi?id=435143。让我们看看他们怎么说。如果他们承认,你的答案是正确的,你会得到 √ ! ;)
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
相关资源
最近更新 更多