2015-12-23 12 views
6

私は現在Java Genericsを読んでいますが、ワイルドカードに関してはちょっと立ち往生しています。Java Generics - クラス自身のサブクラスですか?

public void <T> copy(List<? super T> dest, List<? extends T> src) { 
    for(int i = 0; i < src.size(); i++) { 
     dest.set(i, src.get(i)); 
    } 
} 

私は、このようにメソッドを呼び出すことが可能であると言われています:私はコレクションクラスからこのメソッドを与えられた

List<Object> objs = new ArrayList<Object>(); 
List<Integer> ints = new ArrayList<Integer>(); 
Collections.copy(objs, ints); 

型パラメータとしてましたこのコンパイラは、コンパイラがtypeパラメータをIntegerとして選択すると言う。

これはどのように可能ですか?

それが整数であると見なされた場合、これは、メソッドの宣言であることを意味します -
List<? extends T>List<Integer extends Integer>に変換します。

これは間違いですか?またはジェネリックスに関するさまざまなルールがありますか?私は周りのグーグルと結果の大部分は、クラスは、それ自身のサブクラスにすることはできませんと言います。

+0

ニゼットの答えは正しいのですが、あなたがポイントを逃していれば、それはすべていいですね。しかし、ジェネリックスは非常に混乱する可能性があります。この特定のケースについてより広範な説明が必要だと感じたら、私はそれを与えることを試みることができます。 – user1803551

答えて

8

いいえ、エラーではありません。

? extends Integerは、Integerであるか、またはIntegerを拡張するすべてのクラスを意味します(または、Integerがインターフェイスであった場合はIntegerを実装します)。

? super Integerの場合も同じです。これは、Integerであるか、Integerのスーパークラスまたはスーパーインタフェースであるすべてのクラスを意味します。

+0

これをクリアしていただきありがとうございます。オプションが利用可能になったときに回答を受け入れます。 – user3650602

関連する問題