いくつかのコードを書いていて、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
います。これは、私の例で達成したいことです。T
from はfromConstant<T>
とは異なると想定しているようValue<T>
です。それ以外の場合は、両方をマージしT
て、同じタイプであることを確認できるはずです。達成しようとしていることを正しく実装するにはどうすればよいですか?
(つまり、何かの定数は何かの値であり、それは同じ何かの式です)