繁体   English   中英

如何在Java中使用类型安全的方法转换泛型列表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM