2013-02-26 57 views
6

Oracle's documentation of Type Inference爲什麼類型推斷算法試圖找到最具體的類型?

類型推斷是看每一個方法調用 確定類型 參數(或參數),使調用應用Java編譯器的能力和相應的聲明。推理算法確定參數的類型,並且如果可用,則確定結果被分配或返回的類型。 最後,推理算法試圖找到最適合所有參數的特定類型 。

爲了說明這最後一點,在下面的例子中,推理 確定第二個參數被傳遞到拾取方法的類型爲可序列化的 :

static <T> T pick(T a1, T a2) { return a2; } 
Serializable s = pick("d", new ArrayList<String>()); 

爲什麼該算法試圖找到最具體的類型?

+6

爲什麼不應該嗎? – 2013-02-26 07:01:13

+0

@defaultlocale回答這個問題的一種方法是回答爲什麼不應該呢?如果你知道爲什麼不應該請回答,我會很高興地接受它。 – Geek 2013-02-26 07:02:37

+1

,因爲如果沒有方法重載,就不會有這樣的事情 – radai 2013-02-26 07:05:07

回答

5

因爲如果不執行此規則,賦值兼容性會導致調用不明確。

例如,PrintStream定義print(Object)print(String)如果最具體類型的規則並沒有強制執行,print("bar")可以調用print(Object)代替打印(String),這將是違反直覺。

注意類型的選擇是基於編譯時的類型,所以在下面的例子中print(Object)被調用:

PrintStream out = ...; 
Object bar = "bar"; 
out.print(bar); 
out.print((Object)"foo"); 
相關問題