这个案例似乎是又一个Eclipse的Java编译器打败了javac的案例。对于我来说,唯一的问题是这是否是JLS或javac中的错误。
第二行代码可以在Eclipse中编译,但是在javac中无法编译,报错信息为“类型参数FC不在其限定范围内”。FC声明为继承EndoFunctor ,且FC的限定范围为继承EndoFunctor,其中D是推断出来的? extends C。我认为javac没有意识到通配符在两个上下文中代表相同的未知类型,但是Eclipse可以理解!显然,以下代码可以解决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。
该怎么办呢?