另一种Java泛型“不兼容类型”编译错误
发布时间:2020-12-15 05:10:52 所属栏目:Java 来源:网络整理
导读:我正在编写一些代码并遇到了不兼容的类型编译错误. 这就是我所拥有的: public interface ExpressionT { int getArity(); T evaluate();} public abstract class ValueT implements ExpressionT { @Override public final int getArity() { return 0; }} pub
我正在编写一些代码并遇到了不兼容的类型编译错误.
这就是我所拥有的: public interface Expression<T> { int getArity(); T evaluate(); } public abstract class Value<T> implements Expression<T> { @Override public final int getArity() { return 0; } } public final class Constant<T> extends Value<T> { private final T value; /** Parameter constructor of objects of class Constant. */ public Constant(T val) { value = val; } /** Copy constructor of objects of class Constant. */ private Constant(Constant instance) { value = instance.evaluate(); // Error here. } @Override public T evaluate() { return value; } } 我认为在使用继承时我没有正确地声明泛型,所以我检查了Oracle’s tutorial,他们写了 interface PayloadList<E,P> extends List<E> 上面的声明使用了相同的泛型类型E,这是我想在我的例子中完成的.似乎假设T来自Constant< T>.与Value< T>中的不同.否则它应该能够合并两个T并看到它是相同的类型. (即,某事物的常数是某物的价值,这是同一事物的表达) 解决方法
您的实例变量定义为Constant实例;
如果未在变量上指定泛型,泛型类型将自动为Object,而Object类型与T不同. 你必须使用 private Constant(Constant<T> instance) 代替 private Constant(Constant instance) 因为这与private Constant(Constant< Object>实例)相同 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |