如何在java中输入一个通用列表?

时间:2014-12-01 21:01:16

标签: java

有没有办法在不需要使用@SuppressWarnings("unchecked")

的情况下执行此操作
if (o instanceof Map) {
    Map<Object, Object> newMap = (Map<Object, Object>) o;
    ...
}

1 个答案:

答案 0 :(得分:0)

如果你想写地图,简短的回答是否定的。那么你可以像@ brso05提到的link中给出的例子那样对它进行编码,但我认为这只是违背了目的。基本上编译器告诉你它无法确保地图中的类型是兼容的。

如果您不必写入该地图,则可以使用Map<?, ?>,这意味着您只能从中获取Object类型的项目。例如:

Map untypedMap = new HashMap();
Map<?, ?> map = untypedMap;
Object someValue = map.get(aKey);

推理

原因是Java集合不是covariant

为了简单起见,让我们谈谈列表(但它也适用于地图)。

以下内容在Java中无效(并且有充分理由):

List<Integer> integers = new ArrayList<Integer>();
List<Object> objects = integers; // illegal

Java中的集合是可变的,这意味着您可以执行以下操作:

objects.add(1.4f);

这会改变原始的integers列表,并会向其添加浮动广告。 float是一个对象,因此它会对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);

由于上述原因,无论何时将无类型集合分配给类型化集合,编译器都会发出警告。