【发布时间】:2013-11-25 19:38:37
【问题描述】:
鉴于以下类型签名,我可以使用 JDK 6 和 JDK 7 在 Maven 下编译和运行代码,但 Eclipse 给出了“绑定不匹配:类型 F 不是有界参数@的有效替代品” TupleVisitor 中出现Field<TP,F> 类型的 987654322@" 错误。
我相信我需要这些类型,尽管我知道考虑到精简的示例,这很难激发。任何人都可以提出一个让我继续在 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
}
提交错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=422503
没有发现简单的解决方法。虽然 Rohit Jain 的回答不适用于访问者模式,但我采纳了他的后续建议并从 Field 中删除了 F 作为类型参数。
【问题讨论】:
-
当前为项目设置的 java 编译器合规级别是什么?
-
Eclipse 合规级别:JavaSE-1.6。
-
Maven 源/目标级别 - 1.6.
-
我会注意到,将两者都提高到 1.7 并不能解决问题。
-
@AdamAugusta 令人惊讶的是,如果您在接口
TupleVisitor中声明类型变量F,它工作正常。这让我大吃一惊。