【问题标题】:A bad interaction between self-referential types and bounded wildcards自引用类型和有界通配符之间的不良交互
【发布时间】:2012-03-30 05:28:37
【问题描述】:

这个案例似乎是另一个 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 的限制是它为推断的 D 扩展 EndoFunctor,在这种情况下是?扩展 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。
  • 对不起。这是java 1.6.0_31。

标签: java generics self-reference bounded-wildcard


【解决方案1】:

怎么办?

这里有几个实用的解决方案。

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

  • 忍受它,并使用您已经发现“有效”的两种替代方法之一。

【讨论】:

  • 是的,较新的 javac(例如 openjdk 8)可以很好地编译 OP 的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2015-08-30
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多