加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

另一种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>实例)相同

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读