2013-02-25 69 views
1

從有效的Java:編譯器如何推斷無參數方法的類型?

一個通用的方法,顯着的特點是,你不需要,你必須調用 通用CON組structors時指定 類型參數的值明確。編譯器通過檢查方法參數的類型來計算出類型 參數的值。

那麼編譯器在沒有參數的情況下如何推斷類型?

例如,考慮創建一個新的HashMap每次調用時下列靜態工廠方法:

// Generic static factory method 
public static <K,V> HashMap<K,V> newHashMap() { 
return new HashMap<K,V>(); 
} 

當調用該方法,如:

Map<String,String> pair = newHashMap(); //it returns a Map<String,String> 

,當它被稱爲像

Map<String, List<String>> anagrams =newHashMap(); // it returns a Map<String,List<String> 
+2

它也可以通過調用網站的期望來推斷返回類型,但是隻在有限的情況下:'String s = genericMethod();'其中'genericMethod(){...}'。 – 2013-02-25 15:15:03

+0

@Geek,你有沒有想過的例子? – 2013-02-25 15:23:01

+0

@ KellyS.French請參閱已編輯的問題示例 – Geek 2013-02-25 16:04:32

回答

4

它根據返回的變量類型推斷它也被分配。

public class GenericTest { 

    public static void main(final String[] args) { 
     final GenericTest test = new GenericTest(); 
     String data = test.echo(); 
    } 

    public <T> T echo() { 
     return null; 
    } 
} 

在代碼例子上文中,編譯器推斷基於所述data字段的類型通用參數類型,在這種情況下String

+0

你打算說編譯器的類型推斷依賴於程序員編寫的返回類型嗎?那麼類型安全在哪裏? – Geek 2013-02-25 16:17:39

+0

在討論方法級別泛型時,類型安全性被限制在泛型方法體的範圍,返回類型以及對返回類型的後續操作。 – Perception 2013-02-25 16:20:56

+1

@Geek:你是什麼意思類型安全?你的方法在T上是通用的,所以對於任何T來說它是類型安全的。 – newacct 2013-02-25 18:28:53

0

編譯器只有有限數量的變量來推斷類型。如果一個方法沒有參數,那麼該方法只能是一個簡單的覆蓋,因爲返回值不能用於輸入方法,這就留下了方法本身的名字。編譯器必須選擇繼承鏈有多遠才能選擇哪個父類/子類具有實際調用的方法。

相關問題