java - Eclipse 泛型问题 - 解决方法?

标签 java eclipse generics

鉴于以下类型签名,我能够使用 JDK 6 和 JDK 7 在 Maven 下编译和运行代码,但 Eclipse 给出了“绑定(bind)不匹配:类型 F 不是绑定(bind)参数 <F extends Field<TP,F>> 的有效替代Field<TP,F> 类型的“TupleVisitor 中的错误。

我相信我需要这些类型,尽管我知道鉴于精简示例,这很难激发。任何人都可以建议一个让我继续在 Eclipse 中工作的解决方法吗?

public abstract class Tuple<F extends Field<TP, F>, TP extends Tuple<F, TP>>

public class VariableTuple<F extends Field<VariableTuple<F>, F>> extends Tuple<F, VariableTuple<F>>

public class ConstantTuple<F extends Field<ConstantTuple<F>, F>> extends Tuple<F, ConstantTuple<F>>

public class Field<TP extends Tuple<F, TP>, F extends Field<TP, F>>

public class ConstantField extends Field<ConstantTuple<ConstantField>, ConstantField>

public class VariableField extends Field<VariableTuple<VariableField>, VariableField>

public interface TupleVisitor {
  public <F extends Field<VariableTuple<F>, F>> void visit(VariableTuple<F> tuple, F field); //Eclipse error

  public <F extends Field<ConstantTuple<F>, F>> void visit(ConstantTuple<F> tuple, F field); //Eclipse error
}

Filed bug at: https://bugs.eclipse.org/bugs/show_bug.cgi?id=422503

No simple workaround identified. While Rohit Jain's answer wouldn't work with a visitor pattern, I took his follow-up advice and removed F as a type parameter from Field.

最佳答案

这似乎是 eclipse 的一个错误,因为它在 javac 下对我来说也编译得很好。事实上,我发现很少有与 eclipse 相关的自引用 Java 泛型相关的错误,但这并不存在。所以,也许你应该提交一份。

至于解决此问题的方法,我刚刚找到了一个,我怀疑您会喜欢它,因为您必须使您的界面通用。是的,你没有听错。用接口(interface)本身声明类型参数,可以使代码编译良好。这是编译代码:

interface TupleVisitor<E extends Field<VariableTuple<E>, E>, 
                       F extends Field<ConstantTuple<F>, F>>  {
   void visit(VariableTuple<E> tuple, E field);
   void visit(ConstantTuple<F> tuple, F field);
}

当然有两种类型变量,因为它们的边界是不同的。检查这是否符合您的需要,因为这听起来确实很奇怪,因为类型参数的数量取决于 Tuple 类的实现者总数(实际上很奇怪,不是吗? ?)。否则你必须做一些其他的改变。

关于java - Eclipse 泛型问题 - 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20201731/

相关文章:

java - 如何在java中使函数阻塞?

java - ActiveMQ 生产者生成堆转储

java - 如何使用 Graphics#fillOval 的中心作为引用在中心绘制随机圆

android - Phonegap错误android sdk build.xml :950 : null returned: 1

c# - CaSTLe Windsor - 将泛型实现解析为基类型

Java - 如何将泛型类型的类传递给方法

带有抽象参数的Java泛型接口(interface)调用

android - Facebook Android SDK 的 key 散列无效

java - 如何限制 Java 泛型类型中允许类型的数量

java - 如何以通用方式访问 Java 构造函数?