这个案例似乎是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.
怎么办?
答案 0 :(得分:1)
怎么办?
以下是一些实用的解决方案。
尝试使用Java 7最新补丁版本中的javac
。我记得听说Java 6中的某些javac编译器错误只在Java 7中得到修复...但我不知道一个列表。 (并且Java Bugs数据库在搜索方面毫无希望......)
忍受它,并使用您已经发现“工作”的两种替代方案中的一种。