2

次のコードが記述されている場合:

 List<Integer> list = new ArrayList<Integer>();
 for (int i = 1; i < 10; i++)
 list.add(i); 

Java コンパイラは、arrayList 内に int を追加しても、(Wrapper Class Integer を使用して) 次のコードに変換するため、コンパイル エラーを発行しません。

List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 10; i++)
list.add(Integer.valueOf(i));

しかし、カスタム クラスがあり、オブジェクトをコレクションに格納したい場合はどうなりますか? より具体的には、どのキャスト操作が発生し、これらの操作を追加のオーバーヘッドと見なすことができるか。

次のコードも同様です。

Animal animal= new Animal();
ArrayList<Animal> list = new ArrayList<Animal>();
for (int i = 1; i < 10; i++){
    animal.code=i;
    list.add(animal);
    animal= new Animal();
}
Animal temp;
for (int i = 1; i < 10; i++){
temp=list.get(i);
} 

JVM によって次のように変換されます。

Animal animal= new Animal();
ArrayList<Object> list = new ArrayList<Object>();
for (int i = 1; i < 10; i++){
    animal.id=i;
    list.add((Object)animal);
    animal= new Animal();
}
Animal temp;
for (int i = 1; i < 10; i++){
temp=(Animal)list.get(i);
} 
4

1 に答える 1

2

この現象は型消去と呼ばれます。あなたは近づいていますが、まだ十分ではありません。

メソッド呼び出しから型パラメーターが削除され、メソッドからの戻り値に暗黙のキャストが追加されたかのようです。

ArrayList list = new ArrayList();  // The JVM sees only the raw type

forループの後半:

list.add(animal);  // No (Object) cast necessary, Animal is already implicitly an Object.

そして 2 番目のforループでは:

temp = (Animal) list.get(i);  // Correct, a cast is inserted here.

これは、 your などのカスタム クラスや などAnimalの他のタイプで発生しIntegerます (すでに指摘したように、intは としてボックス化されますInteger)。

于 2013-08-02T23:07:09.443 に答える