2015-07-20 56 views
4

有人可以解釋下面的語法是如何工作的嗎?java類型推斷如何工作?

public static <K, V> HashMap<K, V> getMap(){ 
    return new HashMap<K, V>(); 
} 

如,如果該方法在非實例化的Util類我自己實現了這個可以作爲一個靜態的工廠方法來創建地圖的情況下,對吧?

Map<Integer, String> myMap = MyUtil.getMap(); 

然後會返回一個新的HashMap的Integer鍵和字符串值的條目,我是嗎? 如果是這樣,編譯器和虛擬機如何實現映射的鍵和類型?

我真的很感激,如果有人能解釋Java如何做到這一點。

+2

你看過[Type Inference文檔](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)嗎? – aug

+3

@Codebender:這不是真的 - 給它一個鏡頭。 –

+0

@Codebender我曾嘗試把工作正常。現在很困惑.. – javabot

回答

3

你問'Java如何做到這一點'。 Java是在語言規範中定義的,並沒有規定如何實現規範。因此,選擇解決方案真的取決於實施。所以如果你真的想知道一個特定的編譯器或解釋器如何實現類型推斷,我懷疑這需要熟悉該工具的人來解決。

如果你的問題確實是'規則是什麼',那麼你會發現他們在specification itself,Java API documentationstandard Java tutorial(正式程度越來越低)中的解釋相當不錯。

這是一個非常複雜的區域,需要處理很多繁瑣的案例 - 事實上,它涉及三個過程以正確理解(還原,合併和解決)。但是如果你正在尋找一個簡單的總結,我會說它是「當實例化一個類或方法時,用最具體的類型替換每個泛型類型」。在你的情況下用IntegerV替換KString是最有意義的推論。

+0

你是對的。我想我是在擔心錯誤的東西。:( – javabot