0

次のコード スニペットを理解できません。

List<? extends Number> intList = Collections.nCopies(5, new Integer(10));
List<Object> objList = new ArrayList<Object>();

for(int i = 0; i < 5; i++) {

objList.add(new Object());

}

Collections.copy(objList, intList);

System.out.println("The objList is: " + objList);

copy メソッドの宣言:

static <T> void copy(List<? super T> dest, List<? extends T> src);

List<Object> objList = new ArrayList<Object>();by and objList.add(new Object());lines Object が T と ? の両方を置き換えていることを理解しています。また、copy メソッドの宣言では、最初のパラメーターが T のスーパー クラスである必要があると規定されているためextendssuper排他的節はそうですか? T は同じであってはなりません。有効なコードではないと思います。次のようになった可能性があります。

List<Integer> objList = new ArrayList<Integer>(); (but it gives compilation error.

では、このコードはどのように機能していますか? 説明していただけますか?

4

1 に答える 1

0

あなたの理解に反して、スーパー リレーションシップは再帰的です (したがって、すべての T について、T は T のスーパー タイプです)。

したがって、コピーの満足のいくタイプは次のとおりです。

void copy(List<Object>, List<Number>)

Number は Object を拡張し、Object は Object のスーパー タイプであるためです。

これは、このチュートリアルで少し説明されています: http://docs.oracle.com/javase/tutorial/extra/generics/morefun.html

于 2013-06-05T05:19:26.823 に答える