2012-08-31 101 views
2

我很感興趣,爲什麼這個代碼片段生成一個語法錯誤說ImmutableMap不能被解析爲一個類型:儘管此代碼按預期工作泛型方法的類型參數是做什麼的?

ImmutableMap<String, String> advice = ImmutableMap<String, String>.builder() 
        .put(KEY1, VAL1) 
        .put(KEY2, VAL2) 
        .build(); 

ImmutableMap<String, String> advice = ImmutableMap.<String, String>builder() 
        .put(KEY1, VAL1) 
        .put(KEY2, VAL2) 
        .build(); 

期間不會我的心理模型應該在哪裏,我希望有人能夠解釋爲什麼這個時期的「方法方面」會出現。我正在使用番石榴的ImmutableMap,但它不完全相關,我不認爲。我認爲這與泛型有關,但我不確定如何搜索以找到更好的答案,因爲我不知道該概念會被調用。

編輯:作爲參考,ImmutableMap具有此線爲builder()

public static <K, V> Builder<K, V> builder() { 
    return new Builder<K, V>(); 
} 
+0

http://stackoverflow.com/a/55679/829571 – assylias

+0

可能重複[使用Java Guava庫,如何使用Builder創建ImmutableSortedSet?](http://stackoverflow.com/questions/6362856/using-the-java-guava-library-how-to-create-a-immutablesortedset-using-a-builder) – Xaerxess

回答

6

建設者()是具有與它相關的通用類型的靜態方法,而不是它的類中定義它將會像

public static <K,V> ImmutableMap.Builder<K,V> builder() { ... } 

注:這裏的<K, V>不會有什麼使用類的通用類型。 (這不一定是通用的)

+0

所以,我試圖用@David M把你的答案和其他答案拼湊在一起。因爲這是一個靜態方法,並且泛型類型實際上並沒有與類一起加載到類加載器中,所以該方法需要傳入類型信息? 因此,當我讀取您發佈的行時,是否應將其讀爲: ImmutableMap < - return type |方法 - > builder()?如在方法簽名中包含指示泛型類型的要求? –

+0

從概念上講,它是具有泛型類型的方法的簽名。在這種情況下,泛型類型不會在運行時傳遞或可用。 –

1

的由於Java實現泛型方式,通過類型擦除(鑄造)不擴張,則實際上只有一個ImmutableMap類加載。它的靜態builder方法因此需要解決特定的泛型過載問題。變量advice被聲明爲ImmutableMap<String, String>是編譯器的語法糖,然後在上調用實例方法時,該變量將承擔相關的過載。但是,必須單獨指定在ImmutableMap上的靜態方法調用。這就是爲什麼泛型出現在點的方法一側。

這將是由膨脹實現泛型,如C#,其中每個通用映射類型會被加載爲單獨類型到CLR語言不同,所以ImmutableMap<String, String>將是一個不同類型的具有不同的靜態方法來ImmutableMap<Foo, Bar>

0

很難找到關於這個概念的信息,因爲它有點模糊。我不得不尋找Angelika Langer的泛型常見問題一段時間才能找到它,儘管我知道它...

無論如何,它被稱爲「顯式類型參數說明」,它用於當您要指定類型參數爲一個通用的方法明確,通常是因爲編譯器不能從上下文推斷它(如鏈接方法調用時),或者是因爲你想幫助各種重載的編譯器選擇:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ402

更多信息上類型自變量推理:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ400

相關問題