Java 通配符类型转换和原始类型转换之间有什么区别?

Java 通配符类型转换和原始类型转换之间有什么区别?,java,generics,casting,Java,Generics,Casting,以下两者之间的区别是什么 List <?> list = (List<?>) var; List <String> list = (List) var; List=(List)var; 列表=(列表)变量; 本质上,区别在于一个使代码类型安全,另一个使代码类型不安全 如果您强制转换为原始类型,如(List)var,则基本上放弃了泛型提供的安全性var可以是一个列表,现在您已经对其进行了强制转换,可以将其分配到列表,而无需编译器抱怨。您甚至可以从中获取字符串(

以下两者之间的区别是什么

List <?> list = (List<?>) var;
List <String> list = (List) var;
List=(List)var;
列表=(列表)变量;

本质上,区别在于一个使代码类型安全,另一个使代码类型不安全

如果您强制转换为原始类型,如
(List)var
,则基本上放弃了泛型提供的安全性
var
可以是一个
列表
,现在您已经对其进行了强制转换,可以将其分配到
列表
,而无需编译器抱怨。您甚至可以从中获取字符串(应该是
列表
),而无需编译器抱怨(但这将在运行时引发异常)。因此,转换为原始类型就像对编译器说:

我不知道现在这个列表是什么类型的,但我会在运行时做。我可以一次将所有这些变量的类型信息保存在我的头脑中,所以你不必担心!我会自己处理类型

…如果编译器已经可以为您执行此操作,那么这样做是不明智的。人类容易犯错误

转换为(有界)通配符就像对编译器说:

我不知道现在这个列表是什么类型的,但我会在运行时做。我不能一次把所有这些变量的类型信息都保存在我的头脑中,所以每当我所做的事情可能不总是成功时,你必须给我一个错误,好吗

在这种情况下,编译器知道您不知道泛型参数,因此不允许您执行某些操作,例如向
列表添加
字符串
,因为
可能是
整数。您仍然可以从
列表中获取
对象
,因为无论
是什么,它都必须是
对象
类型列表的子类