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.

在第二个for循环中:

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

这将发生在自定义类中,例如 yourAnimal以及任何其他类型,例如Integer(正如您已经指出的,int将被装箱为Integer)。

于 2013-08-02T23:07:09.443 回答