我的意图是将一个Object转换为(?)但是如何做到这一点?我的代码:
Map<T,?> rawResult = initMap;
final T key = ...
final Object kryoResult = kryo.readClassAndObject(input);
rawResult.put(key,value);
这给我带来了以下错误
错误的第二个参数类型。找到:'java.lang.Object',必填:'?'
演员不起作用:
(?)value
这个:
final ? value = ...
不是吗?一个东西?因为?是“不管......我不在乎?”?
因为?是“不管......我不在乎?”
那是错的:?
是我不知道而不是我不在乎。这就是为什么你不能在地图上添加东西的原因。因为地图也可以容纳String
对象。所以添加Object
会导致错误。
Map<T, String> stringMap = new HashMap<>();
stringMap.put(key, "Value");
Map<T, ?> map = stringMap; // works
Object value = map.get(key); // Object, because "map" doesn't know the types its holding
map.put(key, "New Value"); // doesn't work, even though the map is holding stringValues
另请参阅this question,它更详细地解释了通配符?
。
在这种情况下,您声明接受?(unknown type)
并尝试插入Object(known type)
,编译器无法确认插入到列表中的对象类型,并产生错误。
为了消除这种错误,我们需要使用辅助方法,以便可以通过类型推断捕获通配符。
Map<T, ?> map = new HashMap<>();
T key = ...;
Object value = ...;
putInMap(map, key, value);
以及在地图中放置值的方法:
@SuppressWarnings("unchecked")
<K, V> void putInMap(Map<K, V> map, K key, Object value) {
map.put(key, (V) value);
}
基本上,?(unknown type)
用于想要迭代集合或使用上限类型的映射(对象,如果没有限制)。
您可能想要查看https://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.html的文档。
希望这有帮助。请享用 :)