如何泛化?不是对象

问题描述 投票:-4回答:2

我的意图是将一个Object转换为(?)但是如何做到这一点?我的代码:

Map<T,?> rawResult = initMap;
final T key = ...
final Object kryoResult = kryo.readClassAndObject(input);
rawResult.put(key,value);

这给我带来了以下错误

错误的第二个参数类型。找到:'java.lang.Object',必填:'?'

演员不起作用:

(?)value 

这个:

final ? value = ...

不是吗?一个东西?因为?是“不管......我不在乎?”?

java generics casting
2个回答
1
投票

因为?是“不管......我不在乎?”

那是错的:?是我不知道而不是我不在乎。这就是为什么你不能在地图上添加东西的原因。因为地图也可以容纳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,它更详细地解释了通配符?


-1
投票

在这种情况下,您声明接受?(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的文档。

希望这有帮助。请享用 :)

© www.soinside.com 2019 - 2024. All rights reserved.