[英]How to typesafe cast a generic list in java?
有没有一种方法可以无需使用@SuppressWarnings("unchecked")
if (o instanceof Map) {
Map<Object, Object> newMap = (Map<Object, Object>) o;
...
}
如果要写入地图,简短的回答是“否”。 好了,您可以按照@ brso05提到的链接中给出的示例进行编码,但是我认为这只是违背了目的。 基本上,编译器会告诉您无法确保映射中的类型兼容。
如果您不必写该地图,则可以使用Map<?, ?>
,这意味着您只能从中获取Object
类型的项目。 例如:
Map untypedMap = new HashMap();
Map<?, ?> map = untypedMap;
Object someValue = map.get(aKey);
原因是Java集合不是协变的 。
为了简单起见,让我们谈谈列表(但它也适用于地图)。
以下内容在Java中无效(并且有充分的理由):
List<Integer> integers = new ArrayList<Integer>();
List<Object> objects = integers; // illegal
Java中的集合是可变的,这意味着您可以执行以下操作:
objects.add(1.4f);
这将更改原始integers
列表,并为其添加一个浮点数。 浮点数是一个对象,因此它根据List<Object>
。
现在,由于向后兼容,如果未键入列表,则可以进行这种分配。 例如:
List untyped = new ArrayList();
List<Integer> integers = untyped; // warning here
integers.add(1);
List<Float> floats = untyped; // warning here
floats.add(1.4f);
因此代码可以编译,但是有错误。 考虑以下示例。
System.out.println(untyped.get(0)); // is okay
System.out.println(untyped.get(1)); // is okay
Float aFloat = floats.get(0);// compiles, but throws ClassCastException
System.out.println(aFloat);
Integer anInteger = integers.get(1);// compiles, but ClassCastException
System.out.println(anInteger);
由于上述原因,每当您将无类型集合分配给有类型集合时,编译器都会发出警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.