Java 当您尝试将LinkedList强制转换为LinkedList时,在编译时会发生什么<;字符串>;?
在下面的代码中,我在第5行得到一个运行时异常,而不是第4行。那个演员到底在干什么? 任何有关阅读的见解或链接都将非常棒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(); 添加(新日期())
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;
谢谢你给出的非常有用的答案。我只能接受一个,所以我选择了投票数更多的那个。谢谢你给出的非常有用的答案。我只能接受一个,所以我选择了投票数更多的那个。