java - Java编译器如何转换包含自定义类的Collections?

标签 java collections arraylist compilation jvm

当编写如下代码时:

 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/

相关文章:

java - 使 JPanel 手动调整大小

java - 在 Ubuntu 中构建 Red5 应用程序失败

java - 对对象集合进行排序

Java - 按正则表达式过滤列表条目

php - 如何在不重新索引的情况下将项目添加到 laravel 列表集合中?

java - 如何返回对象 ArrayList 中的总和

java - Android ArrayList 到 ListView 用于搜索 Activity

java - Spring 表单输入不能被禁用

java - PHP Java 桥异常 - 协议(protocol)错误

c# - .net ArrayList.Clear 释放内存吗?