如何泛型?不是对象
我的意图是将对象投射到(?)但是如何做到这一点? 我的代码:如何泛型?不是对象
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其中详细介绍了通配符?
。
@AndyTurner感谢您的编辑,不知何故将其复制,但不完全 – Lino
在这种情况下,如果声明接受?(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。
希望得到这个帮助。享受:)
“为了摆脱这样的错误”您没有摆脱错误,只是将编译时错误更改为运行时错误。编译器告诉你,你正在做的事情不能证明是安全的;这样做 - 有效地说“嘘,你,我知道我在做什么” - 只是在惹麻烦。这里特别隐晦的是,在这段代码中不会出现这种失败,而是在以后,当你试图从地图中得到一个*任何*时,这将是一个完全的噩梦来确定这个值来自哪里。 –
同意。谢谢@Andy纠正它。它应该像“在编译时去掉这样的错误”。 –
但是你仍然错过了我的观点:编译时的错误比运行时的错误要好得多,所以不要盲目地将前者更改为后者。 –
为什么你不想使用明显的'地图''? –
OldCurmudgeon
“将对象转换为(?)”:因为“(?)”不是类型 – anion
,所以不能“转换为(?)”。使用泛型创建类并使用Map中类的对象。 'class className { private T t; 地图 rawResult = initMap; }' –