2017-12-18 268 views
-4

我的意图是将对象投射到(?)但是如何做到这一点? 我的代码:如何泛型?不是对象

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

这使我以下错误

错误的第二个参数的类型。发现:'java.lang.Object',必需:'?'

演员不起作用:

(?)value 

而且这样的:

final ? value = ... 

是不是?一个东西?因为?是“什么......我不在乎?”?

+1

为什么你不想使用明显的'地图''? – OldCurmudgeon

+0

“将对象转换为(?)”:因为“(?)”不是类型 – anion

+0

,所以不能“转换为(?)”。使用泛型创建类并使用Map中类的对象。 'class className { private T t; 地图 rawResult = initMap; }' –

回答

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

@AndyTurner感谢您的编辑,不知何故将其复制,但不完全 – Lino

-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

希望得到这个帮助。享受:)

+1

“为了摆脱这样的错误”您没有摆脱错误,只是将编译时错误更改为运行时错误。编译器告诉你,你正在做的事情不能证明是安全的;这样做 - 有效地说“嘘,你,我知道我在做什么” - 只是在惹麻烦。这里特别隐晦的是,在这段代码中不会出现这种失败,而是在以后,当你试图从地图中得到一个*任何*时,这将是一个完全的噩梦来确定这个值来自哪里。 –

+0

同意。谢谢@Andy纠正它。它应该像“在编译时去掉这样的错误”。 –

+1

但是你仍然错过了我的观点:编译时的错误比运行时的错误要好得多,所以不要盲目地将前者更改为后者。 –