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

afs*_*tos 3 java generics inheritance

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

public interface Expression<T> {
    int getArity();
    T evaluate();
}
Run Code Online (Sandbox Code Playgroud)
public abstract class Value<T> implements Expression<T> {
    @Override
    public final int getArity() { return 0; }
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)

我认为在使用继承时我没有正确地声明泛型,所以我检查了他们编写的Oracle教程

interface PayloadList<E,P> extends List<E>
Run Code Online (Sandbox Code Playgroud)

上面的声明使用相同的泛型类型E,这是我想在我的例子中完成的.似乎假设Tfrom Constant<T>不同于from Value<T>.否则它应该能够合并两者T并看到它是相同的类型.我怎样才能正确实现我想要实现的目标?

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

bpo*_*iss 13

您的instance变量定义为Constant instance;

如果未在变量上指定泛型,则泛型类型将自动为Object,且类型Object不同T.

你必须使用

private Constant(Constant<T> instance)
Run Code Online (Sandbox Code Playgroud)

代替

private Constant(Constant instance)
Run Code Online (Sandbox Code Playgroud)

因为这会是一样的 private Constant(Constant<Object> instance)