自我引用类型和有界通配符之间的错误交互

3
这个案例似乎是又一个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 ,且FC的限定范围为继承EndoFunctor,其中D是推断出来的? extends 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。

该怎么办呢?


你没有说明你使用的javac版本。 - Stephen C
抱歉,这是Java 1.6.0_31版本。 - Judge Mental
1个回答

1
做什么?
以下是一些实用的解决方案。
- 尝试使用Java 7最新补丁版本中的javac。我记得在Java 6中有一些javac编译器错误,只有在Java 7中才得到修复...但我不知道列表。(而且Java Bugs数据库在搜索方面很无助...) - 忍受它,并使用您已经发现的两个“可行”的替代方案之一。

1
是的,一个更新的javac(例如openjdk 8)可以很好地编译OP的代码。 - charlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接