gpt4 book ai didi

java - 为什么 Java 允许将原始 List 传递给通用 List 构造函数?

转载 作者:行者123 更新时间:2023-12-01 10:00:56 25 4
gpt4 key购买 nike

我正在学习OCA认证,并且正在学习ArrayList主题,经过一些测试,我遇到了以下问题:

import java.util.ArrayList;

public class ArrayLists{

public static void main(String[] args) {

ArrayList list = new ArrayList();

list.add(1);
list.add("hi");

// Passing a non-Generics list to a Generics list
ArrayList<String> list2 = new ArrayList<>(list);

for(int i = 0; i < list2.size(); i++) {
System.out.println(list2.get(i));
}

// error, cannot cast Integer to string
for(String s : list2) {
System.out.println(s);
}

}
}

既然我在运行程序时会遇到运行时错误,为什么 Java 会编译此行为?

最佳答案

这使得遗留代码(在 Java 5 存在之前编写的)仍然可以在新编写的代码中使用,无需修改。
列表的声明使用Raw type

    ArrayList list = new ArrayList();

Raw types show up in legacy code because lots of API classes (such as the Collections classes) were not generic prior to JDK 5.0. When using raw types, you essentially get pre-generics behavior — a Box gives you Objects.

这就是为什么可以添加IntegerString。它类似于此声明:

ArrayList<Object> list = new ArrayList<Object>();

但在禁用类型检查的情况下,仅显示警告:

Type Safety: The expression of type ArrayList needs uncheck conversion to conform to Collection < ? extends String>

对于行:

    ArrayList<String> list2 = new ArrayList<>(list); 

关于java - 为什么 Java 允许将原始 List 传递给通用 List 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36812598/

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