4

我正在编写一些代码并遇到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 的教程,他们在其中写道

interface PayloadList<E,P> extends List<E>

上面的声明使用了相同的泛型类型E,这就是我想要在我的示例中完成的。似乎假设Tfrom与 fromConstant<T>不同Value<T>。否则它应该能够合并两者T并看到它是相同的类型。如何正确实现我想要实现的目标?

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

4

1 回答 1

15

您的instance变量定义为Constant instance;

如果您没有在变量上指定泛型,则泛型类型将自动为Object,并且类型Object不同于T.

你必须使用

private Constant(Constant<T> instance)

代替

private Constant(Constant instance)

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

于 2013-05-26T17:26:06.530 回答