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

4
以下两者有何不同?
List <?> list = (List<?>) var;
List <String> list = (List) var;

类型列表 <字符串> - EclipseC
1个回答

4
基本上,区别在于一个使您的代码类型安全,另一个使其类型不安全。
如果您将其转换为原始类型,例如 (List)var,那么您基本上放弃了泛型提供的安全性。 var 可能是 List<Integer>,现在您已经进行了转换,可以将其分配给 List<String> 而不会收到编译器的投诉。即使您从中获取字符串(实际上应该是 List<Integer>),编译器也不会发出警告(但这会在运行时引发异常)。因此,将其转换为原始类型就像对编译器说:

我现在不知道这将是什么类型的列表,但我会在运行时处理它。我可以同时在头脑中保持所有这些变量的所有此类型信息,因此您不必担心!我自己处理类型。

这并不是一个明智的做法,如果编译器已经可以为您完成它。人类往往会犯错误。
将其转换为(有界)通配符就像对编译器说:

我现在不知道这将是什么类型的列表,但我会在运行时处理它。我无法同时在头脑中保持所有这些变量的所有此类型信息,因此您必须在我尝试时发出错误,以防我的操作可能不总是成功,好吗?

在这种情况下,编译器知道您不知道泛型参数,因此禁止您执行某些操作,例如向 List<?> 添加 String,因为 ? 可能是 Integer。但是,您仍然可以从 List<?> 中获取 Object,因为无论 ? 是什么,它都必须是 Object 的子类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接