1

Java は、このクラスに Type 宣言のサブクラスを追加することを許可していません

public class Exam<T> {

    public  void set(Holder<? super T> hold){

    }
    public  T get(Holder<? extends T> holder){ return holder.get();}


    public static void main (String[] args){
        Exam<Question> eq = new Exam<Question>();
        eq.set(new Holder<Identification>());
    }
}

Identification は Question のサブクラスです。

これは私のホルダークラスがどのように見えるかです

public class Holder<T> {
    T item;

    public void set(T item){ this.item = item; }
    public T get(){return item;}
}

エラー

The method set(Holder<? super Question>) in the type Exam<Question> is not applicable for the arguments (Holder<Identification>)
4

5 に答える 5

5

エラーは私にはかなり自明のように見えます-setメソッドはを期待しHolder<? super Question>、あなたはそれにサブクラスである何かのホルダーを与えようとしていますQuestion。書かれているように、たとえば、をExam.set取ることができますが、ではありません。Holder<Object>Holder<Identification>

ジェネリックスについて考える良い方法は、割り当ての観点からです。extendsキャストせずに割り当ての右側で使用できるすべてのタイプを受け入れます。superT extends FooTFoo

Foo something = new T();

(これを擬似コードとして扱います-私はあなたが実際にnew変数型を許可されていないことを知っています)。逆に、T super Fooキャストせずに割り当ての左側で使用できるすべてのTを受け入れます。

T myThing = new Foo();

あなたの特定の例でIdentification i = new Question()は、キャストなしでは合法ではないので、Holder<? super Question>パラメーターは値を受け入れることができませんHolder<Identification>

于 2012-09-06T11:00:53.630 に答える
1

Exam<T>Tの任意のサブクラスをHolder<T>保持できるを期待します。それが何をするかです。あなたは合格していますが、それのスーパークラスでもありません。superHolder<Identification>IdentificationT

于 2012-09-06T11:04:00.203 に答える
1

クラスEnumのsetメソッドをに変更

public  void set(Holder<? extends T> hold){

}
于 2012-09-06T11:09:50.413 に答える
0

Genericは不変です。それはあなたのための答えかもしれません。Invariantは、Type2がType1のサブクラスであることを意味するため、ListがListであることを意味するわけではありません。

于 2012-09-06T11:04:28.820 に答える
0

次のように書くと機能します(ただし、もちろん別の意味があります)。

public  void set(Holder<? extends T> hold){ }
于 2012-09-06T11:08:16.150 に答える