另一种Java泛型“不兼容类型”编译错误

时间:2013-05-26 17:19:34

标签: java generics inheritance

我正在编写一些代码并遇到incompatible types编译错误。 这就是我所拥有的:

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不同。否则它应该能够合并 {{1}}并看到它是相同的类型。 我怎样才能正确实现我想要实现的目标?

即,某事物的常数是某物的价值,这是同一事物的表达

1 个答案:

答案 0 :(得分:13)

您的instance变量定义为Constant instance;

如果您未在变量中指定通用,则通用类型将自动为Object ,类型ObjectT不同

你必须使用

private Constant(Constant<T> instance)

而不是

private Constant(Constant instance)

因为这与private Constant(Constant<Object> instance)

相同