将一个原始类型分配给一个泛型类型将假定没有泛型约束(它将默认为Object),但删除任何可能存在的编译时类型安全保证。
但你不能指定一个原始的List <Object>
既然已经 删除
这听起来像有此类型擦除的根本误解。原始类型是泛型类型的最终结果。您指定List<Integer>
时,编译器将验证该类型信息,然后删除<Integer>
部分,根据原始类型的List对操作插入强制转换为Integer。
这意味着这两个检索操作是完全一样的。
List<Integer> integerList = new ArrayList<Integer>();
integerList.add(5);
Integer i = integerList.get(0);
Integer ii = (Integer)((List)integerList).get(0);
例如,以下是合法的。这只会给出一个警告(不会导致编译器错误或运行时错误),因为我们正在对Object进行操作,并且仍然在所包含类型的适当范围内。
List<Object> objects = (List)integerList;
Object value = objects.get(0);
System.out.println(value);
它将打印输出5.类型系统帮助的地方是如果你尝试做这样的事情。
List<String> badStringList = integerList;
它会给你一个编译器错误,指出存在类型不匹配。然而,直接使用原始类型将会抛弃所有类型的安全性,并完全依靠您的判断来确定应该使用的正确类型。如果你弄错了,这可以让你轻松地拍摄自己的脚。
List<String> badStringList = (List)integerList;
String badValue = badStringList.get(0); //ClassCastException is thrown at runtime
列表
它给出了一个警告,因为你正在将一个泛型类型(_has_额外的编译时类型信息)转换为原始类型(它没有)。这是合法的(并且必须是出于遗产原因,不可否认的说),但不建议。你实质上是在告诉编译器:“你知道你在管理类型变更的List吗?别再担心了,我自己会这样做”,编译器会这样说:“嘿,你是否意识到你'这么做?你可能会把这件事搞得很糟糕。“ –
感谢您的回复。从泛型类型到原始类型的警告我没有任何问题。这是从原始回到列表