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 に答える