3

タイプ、、、、、、、およびを考えると、私List<?>はそれらの階層を理解しようとしています。List<Object>List<? super Number>List<Number>List<Integer>List<? extends Number>

確かにのサブタイプですが、それはのList<Integer>サブタイプではないことを私は知っているので、代わりにのサブタイプだと思いました。List<Number>IntegerNumberList<? extends Number>

しかし、List<? extends Number>直感的にはのサブタイプのように見えますList<Number>。これは、私の考えが示すように、結局のところList<Integer>子孫になります。List<Number>

ここに画像の説明を入力してください

それで、タイプが別のタイプから派生しているが、直接ではない場合、それはまだその祖先のサブタイプですか(または私は図で間違っています)?この演習では、?対について少し混乱しました...実際には、私が持っていて混乱しObjectているように見えます。最大の質問の1つは、「「すべて」は...またはすべては?」ということだと思います。または両方...またはどちらでもない?List<Object>List<? super Number>Object?

4

1 に答える 1

2

List<Integer>のサブタイプではない理由List<Number>

List<Number>受け入れるシナリオを考えてみList<Integer>ましょう(これは実際には機能しません)。

  List<Integer> listI =new ArrayList<Integer>();
  List<Double>  listD = new ArrayList<Double>();
  method(listI);
  method(listD);

引数を取るメソッドがありList<Number>ます。

   public void method(List<Number> list) {
    list.add(new Double()); // would fail if you pass an List<Integer> as Integer is not a super type of Integer.
    list.add(new Integer()); //would fail if you pass an List<Double> as Double is not a subtype of Integer       
    }     

したがって、メソッド引数がList<number>acceptsとして宣言されていて、Doubleのリストに整数List<Double>を追加しようとした場合。これは間違っています。Doubleは整数スーパータイプではないため、サブタイプではないためです。List<Number>List<Integer>

List<? extends Number>ここで、がの代わりにメソッド引数である同じシナリオを考えてみましょう。List<Number>

            public void method(List<? extends Number> list) {
                      // list.add(new Double()); 
                      // list.add(new Integer());       
               }

そして今、あなたはList<Integer>このメソッドにを渡します。それが受け入れられ、整数のリストにDoubleを追加しようとした場合。BOOM ...整数のリストにDoubleを追加しました。

非公式の例をあげる。サブタイプとして犬を含む動物のスーパータイプを考えてみましょう。これで、受け入れるメソッドがあり、このメソッドにDogを渡します。このメソッドでは、猫を追加しようとします。に 間違ったタイプ(CAT)を追加するため、のサブタイプではありません <? extends Animal>**List<Dog>**List<? extends Animal>

これが十分に表現力がない場合は私に知らせてください。ありがとう:)

于 2012-11-17T23:04:20.417 に答える