4

重複の可能性:
java generics スーパー キーワード

私の知識を以下のサンプルプログラムに関連付けることができません。以下のサンプルプログラムを参照してください。私の疑問はそのプログラムの下にあります。

import java.util.*;
class A { }
class B extends A { }
class C extends B { }

public class sampleprog {

    public static void main(String[] args) {

        List<? super A> list1 = new ArrayList<A>();
        list1.add(new A());//valid. ok
        list1.add(new B());//valid, why? it is not super to A?
        list1.add(new C());//valid, why? it is not super to A?

        List<? super B> list2 = new ArrayList<A>();
        list2.add(new A());//not valid. why? it is also super to B!!!
        list2.add(new B());
        list2.add(new C());

        List<? super C> list3 = new ArrayList<C>();
        list3.add(new A());//not valid, why? It is super to A so should be valid!!!
        list3.add(new B());//not valid, why? It is super to A so should be valid!!!
        list3.add(new C());
    }
}

私の疑問: - 私が知る限り、? super T追加できるクラスを意味しますがT、ここでは出力が異なりますか? サブクラスも正常に追加されましたが、これは完全に混乱しています。・出力はリスト初期化( List<? super C> list3 = new ArrayList<C>();)と変わらない。この初期化では、Aorのリストを割り当てましたがB、出力は同じでした!

私の疑問を解消してください。

4

4 に答える 4

1

ジェネリック宣言で使用する場合? super、参照は同じジェネリック型のコレクションまたはスーパージェネリック型のコレクションを指すことができます。したがって、この場合、IS-A テストに合格するものはすべて有効です。

于 2013-01-02T03:59:29.187 に答える
1

List<? super B>という意味です

List<? super B> list1 = new ArrayList<A>();
List<? super B> list1 = new ArrayList<B>();

許可されます。ArrayList<A>のスーパーArrayList<B>ですね。と>の両方にBとを追加できますか? はい、できます。を追加できますか? Only to Butは to tooを指すこともできます。したがって、 に を追加することはできません。CArrayList<A>ArrayList<BAArrayList<A>.List<? super B>ArrayList<B>AList<? super B>

于 2013-01-02T05:13:29.793 に答える
1

"? super T" は、T またはそのサブクラスのインスタンスである必要がある、追加できる任意のクラスを意味します。

したがってList<? super C> list3 = new ArrayList<C>();、list3 では、クラス C のインスタンスまたはそのサブクラス インスタンス ( SomeClass extends C) を追加できます。

親オブジェクト リストは、それ自体、子、および子の子を持つことができますが、子クラス用に作成されたリストは、その親オブジェクトを持つことはできません。あなたが今明確であることを願っています。

于 2013-01-02T05:13:38.380 に答える
0

@us2012のコメントに投票してください。

  • にとってList<? super A>

    タイプはAです。A、B、CはすべてAのサブタイプなので、追加できます。

  • にとってList<? super B>

    タイプはA、Bにすることができます。BとCはどちらもAまたはBのサブタイプです。List<? super B> list2 = new ArrayList<A/B>()

  • にとってList<? super C>

    タイプはA、B、Cにすることができます。したがって、CのみがA、B、またはCのサブタイプです。

たとえば、Machine-> Car-> SportsCarList<? super Machine>なぜなら、Machine、Car、SportsCarに関係なく、それらはすべてMachineであるため、追加しても安全です。

于 2013-01-02T04:49:56.700 に答える