gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:19:17 29 4
gpt4 key购买 nike

当编写如下代码时:

 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com