这个案例似乎是另一个 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< ? 扩展 C, FC >,并且对 FC 的限制是它为推断的 D 扩展 EndoFunctor< D, FC >,在这种情况下是?扩展 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 带到任何地方。
该怎么办?