以下有什么区别?
List <?> list = (List<?>) var;
List <String> list = (List) var;
本质上,区别在于一种使您的代码类型安全,另一种使您的代码类型不安全。
如果您转换为原始类型,例如(List)var,您基本上放弃了泛型提供的安全性。var可能是 a List<Integer>,现在你已经转换了它,你可以将它分配给 aList<String>而编译器不会抱怨。您甚至可以从中获取字符串(应该是 a List<Integer>),而编译器不会抱怨(但这会在运行时引发异常)。因此,转换为原始类型就像对编译器说:
我现在不确切知道这将是什么类型的列表,但我会在运行时执行。我可以一次将所有这些变量的所有这些类型信息都保存在我的脑海中,因此您无需担心!我会自己处理类型。
...如果编译器已经可以为您做到这一点,那么这不是明智的做法。人类往往会犯错误。
转换为(有界)通配符就像对编译器说:
我现在不确切知道这将是什么类型的列表,但我会在运行时执行。我不能一下子把所有这些变量的所有这些类型的信息都保存在我的脑海里,所以每当我正在做的事情可能不会一直成功时,你必须给我一个错误,好吗?
在这种情况下,编译器知道您不知道泛型参数,因此不允许您执行某些操作,例如将 a 添加String到 a List<?>,因为?可能是Integer。你仍然可以Object从 a 中取出 s List<?>,因为不管?是什么,它都必须是 的子类Object。