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
可以是一个列表
,现在您已经对其进行了强制转换,可以将其分配到列表
,而无需编译器抱怨。您甚至可以从中获取字符串(应该是列表
),而无需编译器抱怨(但这将在运行时引发异常)。因此,转换为原始类型就像对编译器说:
我不知道现在这个列表是什么类型的,但我会在运行时做。我可以一次将所有这些变量的类型信息保存在我的头脑中,所以你不必担心!我会自己处理类型
…如果编译器已经可以为您执行此操作,那么这样做是不明智的。人类容易犯错误
转换为(有界)通配符就像对编译器说:
我不知道现在这个列表是什么类型的,但我会在运行时做。我不能一次把所有这些变量的类型信息都保存在我的头脑中,所以每当我所做的事情可能不总是成功时,你必须给我一个错误,好吗
在这种情况下,编译器知道您不知道泛型参数,因此不允许您执行某些操作,例如向列表添加字符串,因为?
可能是整数。您仍然可以从列表中获取对象
,因为无论?
是什么,它都必须是对象
类型列表的子类