当编写如下代码时:
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 10; i++)
list.add(i);
Java 编译器不会发出编译错误,即使我们在 arrayList 中添加一个 int,因为它将(通过使用包装器类整数)转换为以下代码:
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);
}
最佳答案
这种现象称为type erasure .你很接近,但还不完全。
就好像从方法调用中删除了类型参数,并将隐式转换添加到方法的返回值中。
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.
这将发生在自定义类中,例如您的 Animal
以及任何其他类型,例如 Integer
(正如您已经指出的那样, int
将装箱为 Integer
)。
关于java - Java编译器如何转换包含自定义类的Collections?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027398/