以下两者有何不同?
List <?> list = (List<?>) var;
List <String> list = (List) var;
(List)var
,那么您基本上放弃了泛型提供的安全性。 var
可能是 List<Integer>
,现在您已经进行了转换,可以将其分配给 List<String>
而不会收到编译器的投诉。即使您从中获取字符串(实际上应该是 List<Integer>
),编译器也不会发出警告(但这会在运行时引发异常)。因此,将其转换为原始类型就像对编译器说:
这并不是一个明智的做法,如果编译器已经可以为您完成它。人类往往会犯错误。我现在不知道这将是什么类型的列表,但我会在运行时处理它。我可以同时在头脑中保持所有这些变量的所有此类型信息,因此您不必担心!我自己处理类型。
在这种情况下,编译器知道您不知道泛型参数,因此禁止您执行某些操作,例如向我现在不知道这将是什么类型的列表,但我会在运行时处理它。我无法同时在头脑中保持所有这些变量的所有此类型信息,因此您必须在我尝试时发出错误,以防我的操作可能不总是成功,好吗?
List<?>
添加 String
,因为 ?
可能是 Integer
。但是,您仍然可以从 List<?>
中获取 Object
,因为无论 ?
是什么,它都必须是 Object
的子类。