1

Java でスーパータイプ ジェネリックをテストしてきましたが、障害が発生しました。これは私がテストしていたサンプルコードです:

import java.util.*;

class GenericTests {
    public static void main( String[] args ) {      
        List<B> list3 = new ArrayList<B>();
        testMethod( list3 );
    }

    public static void testMethod( List<? super B> list ) {
        list.add( new A() );
        list.add( new B() );
    }
}

class A { }

class B extends A { }

コンパイルすると、エラーは次のようになります。

GenericTests.java:20: error: no suitable method found for add(A)
            list.add( new A() );
                ^
method List.add(int,CAP#1) is not applicable
  (actual and formal argument lists differ in length)
method List.add(CAP#1) is not applicable
  (actual argument A cannot be converted to CAP#1 by method invocation conve
rsion)
where CAP#1 is a fresh type-variable:
CAP#1 extends Object super: B from capture of ? super B
1 error

B の下限を考えると、任意のスーパータイプを追加できると思いましたか? それとも、スーパータイプを許可すると型チェックが中断されるため、これは参照 (つまり、メソッド シグネチャ内の引数) にのみ適用されますか?

4

2 に答える 2

3

宣言List<? super B> listは、それlistListB が継承するあるタイプのオブジェクトの であると述べています。ただし、このタイプは と互換性がある必要はありませんA。階層が次のようになっているとします。

public class A {...}

public class C extends A {...}

public class B extends C {...}

次に、 にlistなる可能性がありList<C>ます。しかし、その後list.add(new A())は違法です。のインスタンスは のインスタンスでAはありませんC。コンパイラは、 のインスタンスBまたはサブクラスを に追加できることだけを知っていますlist

于 2013-05-21T03:15:11.397 に答える
0

? super Bあなたは実際とは違うという考えを得ました。ここsuperで行うことは、次のようなものです。

public static void main( String[] args ) {      
    List<B> list3 = new ArrayList<B>();
    testMethod( list3 );

    List<A> listA = new ArrayList<>();
    testMethod(listA); --> U can pass a list of A
}

public static void testMethod( List<? super B> list ) {
    list.add( new B() );
}

この回答では、事実について詳しく説明しています。

于 2013-05-21T03:21:26.533 に答える