2017-12-18 171 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

但是你仍然錯過了我的觀點:編譯時的錯誤比運行時的錯誤要好得多,所以不要盲目地將前者更改爲後者。 –