自引用类型与有界通配符之间的不良交互

时间:2012-03-30 05:28:37

标签: java generics self-reference bounded-wildcard

这个案例似乎是Eclipse的Java编译器破坏javac的另一个案例。对我来说唯一的问题是它是JLS还是javac中的错误。

interface EndoFunctor< C, FC extends EndoFunctor< C, FC > > { /*...*/ }
interface Algebra< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ }

第二行在Eclipse中编译,但无法在javac中编译,并显示“类型参数FC不在其范围内”的消息。

声明FC扩展EndoFunctor&lt; ?扩展C,FC&gt;,并且FC上的绑定是它扩展EndoFunctor&lt; D,FC&gt;对于推断的D,在这种情况下是?扩展C.我认为javac没有意识到通配符在两种情况下都表示相同的未知类型。但是,Eclipse会这样做!

显然以下解决了javac中的问题:

interface EndoFunctor< C, FC extends EndoFunctor< ? extends C, FC > > { /*...*/ }

但这是一个比我想要的界面更宽松的定义。

我也可以试试

interface Algebra< C, D extends C, FC extends EndoFunctor< D, FC > >

但是这种方法迫使我在任何地方携带额外的类型参数D.

怎么办?

1 个答案:

答案 0 :(得分:1)

  

怎么办?

以下是一些实用的解决方案。

  • 尝试使用Java 7最新补丁版本中的javac。我记得听说Java 6中的某些javac编译器错误只在Java 7中得到修复...但我不知道一个列表。 (并且Java Bugs数据库在搜索方面毫无希望......)

  • 忍受它,并使用您已经发现“工作”的两种替代方案中的一种。