Java 当您尝试将LinkedList强制转换为LinkedList时,在编译时会发生什么<;字符串>;?

Java 当您尝试将LinkedList强制转换为LinkedList时,在编译时会发生什么<;字符串>;?,java,generics,casting,Java,Generics,Casting,在下面的代码中,我在第5行得到一个运行时异常,而不是第4行。那个演员到底在干什么? 任何有关阅读的见解或链接都将非常棒 List list = new LinkedList(); list.add(new Date()); list.add("Hello"); List<String> list2 = (List<String>)list; String value = list2.get(1); List List=newlinkedlist(); 添加(新日期())

在下面的代码中,我在第5行得到一个运行时异常,而不是第4行。那个演员到底在干什么? 任何有关阅读的见解或链接都将非常棒

List list = new LinkedList();
list.add(new Date());
list.add("Hello");
List<String> list2 = (List<String>)list;
String value = list2.get(1);
List List=newlinkedlist();
添加(新日期());
添加(“你好”);
列表2=(列表)列表;
字符串值=list2.get(1);
那个演员到底在干什么

没有,在执行时。这就是为什么你会得到一个警告,说这是一个未经检查的强制转换-它没有真正检查任何东西,因为对象本身(在执行时)没有成为
列表的概念-它只是一个列表。如果你有:

Object x = ...;
List<String> list = (List<String>) x;
对象x=。。。; 列表=(列表)x;
然后检查
x
是否引用了某种类型的列表。。。但它不会检查清单的“严格性”

不幸的是,Java泛型就是这样工作的:(

那个演员到底在干什么

在执行时没有。这就是为什么您会收到一条警告,说它是未经检查的强制转换-它没有真正检查任何内容,因为对象本身(在执行时)没有成为
列表的概念-它只是一个列表。如果您有:

Object x = ...;
List<String> list = (List<String>) x;
对象x=。。。; 列表=(列表)x;
然后检查
x
是否引用了某种列表……但它不会检查列表的“严格性”


不幸的是,Java泛型就是这样工作的:(

编译器在删除泛型之前会检查它们

final List<String> strings = ...
strings.add(new Date());
前两个警告与将项目添加到未知类型的
列表中有关-这是因为您可以执行相反的操作,这将在运行时导致问题:

List<String> strings = new ArrayList<>();
List raw = strings;

编译器在删除泛型之前会检查它们。因此类似于:

final List<String> strings = ...
strings.add(new Date());
前两个警告与将项目添加到未知类型的
列表中有关-这是因为您可以执行相反的操作,这将在运行时导致问题:

List<String> strings = new ArrayList<>();
List raw = strings;

谢谢你给出的非常有用的答案。我只能接受一个,所以我选择了投票数更多的那个。谢谢你给出的非常有用的答案。我只能接受一个,所以我选择了投票数更多的那个。