有没有办法在不需要使用@SuppressWarnings("unchecked")
if (o instanceof Map) {
Map<Object, Object> newMap = (Map<Object, Object>) o;
...
}
答案 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);
由于上述原因,无论何时将无类型集合分配给类型化集合,编译器都会发出警告。