1

このコード

static void writeTo(List<? super Apple> apples) {
        apples.add(new Apple());
        apples.add(new Jonathan());
    }

このコードの作成者は、次のように述べています。

引数 apples は、Apple の基本型である型の List です。したがって、Apple または Apple のサブタイプを追加しても安全であることがわかります。下限はAppleなので、

Jonathan は Apple のサブクラスです。

しかし、これを試したとき

    List<Jonathan> loj = new ArrayList<Jonathan>();
    listSuper(loj);

それは私にこのエラーを与えました

The method listSuper(List<? super Apple>) in the type Basket<T> is not applicable for the arguments (List<Jonathan>)

listSuperこんなところに

static void listSuper (List<? super Apple> cont) {}

2つの違いは何ですか?

また、私が投稿した最初のコードで私を混乱させたのは、私が考えたということですか? スーパー T は、T の任意の基本型を意味します。しかし、見た目から、彼は T のサブタイプを追加しました。私は混乱しています。

4

5 に答える 5

6

List<? super Apple>Listは、に を追加できることを意味しますApple(また、Jonathan は であるため Apple、そのタイプのにJonathans を追加することもできListます)。

に任意の s を入れることはできないためList<Apple>List<Fruit>またはList<Object>にすることはできますが、 にすることはできません。ご覧のとおり、この場合は 、またはそのスーパークラスのいずれかになります。List<Jonathan>AppleList<Jonathan>?Apple

List<? extends Apple>Listから取得できることを意味しますAppleList<Apple>またはにすることができますが、は のみを含むことが保証されていList<Jonathan>ないList<Fruit>ため、 ではありません。List<Fruit>Apple

この説明は、「プロデューサー - extends、コンシューマー - super」ルールとして知られています。パラメーターが要素のコンシューマーとして機能する場合は、で宣言する必要がありsuper、その逆も同様です。

于 2012-09-06T14:05:21.093 に答える
4

JonathanはのサブタイプでAppleあり、スーパータイプではありません。一致しますが一致<? extends Apple>しません<? super Apple>

于 2012-09-06T14:04:29.520 に答える
0

コードの作者が間違っていました。Appleのサブクラスを次のメソッドに渡すことはできませんか?スーパーアップル、アップル自体とアップルのスーパークラスのみ。Appleのサブクラスを追加できるようにする場合は、?を使用する必要があります。Appleを拡張します。

于 2012-09-06T14:04:07.010 に答える
0

2つの違いは何ですか?

また、私が投稿した最初のコードで私を混乱させたのは、私が考えたということですか? スーパー T は、T の任意の基本型を意味します。しかし、見た目から、彼は T のサブタイプを追加しました。私は混乱しています。

(1) ジェネリック リストに挿入できるものと、(2) ジェネリック リスト パラメーターを使用してメソッドに引数として送信できるものを区別する必要があります。

  1. バインドされた型パラメーターは、そのすべてのサブタイプを参照できる基本クラスであるため、 のサブタイプを挿入できAppleます。apples

  2. Jonathanが のスーパー タイプでない場合、そのメソッドにのリストAppleを送信しようとするのは一般的に正しくありません。次に、タイプセーフではない、何も知らないオブジェクトのプロパティとメソッドにアクセスするタイプの参照があります。JonathanAppleJonathanJonathan

于 2012-09-06T14:11:04.623 に答える
0

type パラメーターは、 subclassではなく、Appleのスーパータイプでなければなりません。したがって、たとえば、これは有効です。Jonathan

List<Fruit> loj = new ArrayList<Fruit>();     
listSuper(loj); 
于 2012-09-06T14:05:54.853 に答える