【问题标题】:How to extend a non-static class with a generic argument?如何使用泛型参数扩展非静态类?
【发布时间】:2012-11-26 15:23:53
【问题描述】:

在我的应用程序中,有这行代码引起了麻烦:

public class DisplayListing<R extends Listing<R, L>, L extends Listing<R, L>.Loader> extends SherlockListFragment { ... }

使用 Eclipse 一切正常。但是在切换到 IntelliJ IDEA 之后会弹出错误:

范围内没有“com.app.Listing”类型的封闭实例。

这个错误信息是指Listing&lt;R, L&gt;.Loader部分(Loader是一个非静态类)。

当我转到 IntelliJ 的首选项并将编译器从 Javac 更改为 Eclipse 时,我又回到正题:应用程序将成功编译并再次运行。

但是指示错误的红色标记将保留(我想摆脱它)。所以我想知道我是否真的做错了什么,我的通用参数应该被修复,或者是否可以依赖 Eclipse 编译器并忽略错误?

【问题讨论】:

  • 代码在我的 IntelliJ 中看起来不错。你用的是java 1.7吗?
  • 我刚刚更新到 1.7 但问题依旧。除此之外,我在 javac 和 EJC 之间切换了几次,并使 IntelliJ 缓存无效,然后它突然用 javac 成功编译。即使提到的部分仍然被标记为错误...
  • Loader 的可见度如何?
  • 如果 IntelliJ 的行为与 javac 不同,请在其站点上提交针对 IntelliJ 的错误报告。

标签: java generics intellij-idea inner-classes


【解决方案1】:

这是一个合法的错误,无需任何复杂的泛型即可重现:

public class Foo<T extends Bar.Baz> {}

class Bar {
    class Baz {}
}

似乎 IntelliJ 解析器(不是它的编译器,它是 javacecj)将 extends Bar.Baz 误认为是 Foo 声明的一部分,而不是 T。换句话说,这与您(正确)执行此操作时遇到的错误相同:

public class Foo extends Bar.Baz {}

这是IDEA Issue #94011。您可以对该问题进行投票以给予更多关注。

【讨论】:

  • 谢谢,太糟糕了,我在中间添加了一份自己的报告。好像删不掉了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
相关资源
最近更新 更多