2013-11-15 56 views
1

我有一個名爲Identifier的類和一些名爲Variable,Scalar等的所有類都從Identifier擴展的類。使用通配符時Java Hashmap的返回類型

所以,當我宣佈像一個新的Hashmap:

Hashmap<String, ? extends Identifier> hm = new Hashmap<String, ? extends Identifier>(); 

將返回類型是什麼,當我打電話:

hm.get(String) 

因爲很明顯,這樣的事情是無效的:

(? extends Identifier) temp = hm.get(String); 

我真的不知道一個解決方案,而不做一些類型轉換或使用通用的對象作爲這兩種類型我都不想做。

+4

這就是'?'的意義。你不完全知道。它最多可以是一個「標識符」。 –

回答

4

你無法知道。你所知道的是它是Identifier,這就是你應該假設的這種情況。

public Identifier getValue(string value) { 
    return hm.get(value); 
} 
1

在到達get之前,您會遇到問題,並且需要實例化地圖。你不能用通配符實例化一個類型:

//     Can't do this! 
new Hashmap<String, ? extends Identifier>() 

因爲你可能不關心,你可以存儲哪種類型的Identifier,只是完全消除通配符:

HashMap<String, Identifier> hm = new HashMap<String, Identifier>(); 

(這也將允許使用put方法,沒有它不會有一個指向後面get

Identifier temp = hm.get(someString); 
1

概念上,它幾乎是一個(? extends Identifier)。當然,你是對的,你不能寫這個。但請想一想:「某種類型是Identifier的子類型」。換句話說:Identifier! (記住,一個類型本身就是一個子類型)。

Identifier temp = hm.get(String);