Javac推斷在方法f()
中T
是String
。語言規範中的哪些規則導致了這個結論?爲什麼這個通用代碼編譯?
<T> T g(){ return null; }
String f()
{
return g();
}
Javac推斷在方法f()
中T
是String
。語言規範中的哪些規則導致了這個結論?爲什麼這個通用代碼編譯?
<T> T g(){ return null; }
String f()
{
return g();
}
我懷疑編譯器有效地利用section 15.12.2.8:
如果在上下文在那裏它將受到賦值轉換(第5.2節)到S型發生方法的結果,則令R爲所聲明的方法的結果類型
這是處理return語句就好像它受分配轉換的影響一樣。例如,假設我們轉換f()
到:
String f()
{
String tmp = g();
return tmp;
}
現在,當它是否受到賦值轉換,section 14.17(return語句)包含此:
帶表達式的return語句必須包含在聲明爲返回值(§8.4)或發生編譯時錯誤的方法聲明中。表達式必須表示某個類型T的變量或值,否則會發生編譯時錯誤。類型T必須是可分配的(第5.2節)到方法的聲明結果類型,否則會發生編譯時錯誤。
即參照5.2是「賦值轉換」部分,所以我想這意味着表達g()
是「受賦值轉換」,導致部分15.12.2.8可應用於該部分。
T被推斷爲是一個字符串,因爲G的通用返回類型()被用作f的返回類型(),它是強類型爲字符串。爲了使語句有效,T必須是一個字符串,所以它是。
因爲g是一個通用方法,所以Java推斷g的類型與f的返回類型相匹配。
您可以通過嘗試以下三種功能來查看此信息。
class SomeClass{
<T> T g(){return null;}
String f() {
return this.<String>g();
}
Integer h() {
return this.<Integer>g();
}
Integer i() {
return this.<String>g();
}
}
f和h會很好地編譯,因爲它會從返回類型推斷出類型。我不會編譯,因爲類型不匹配。
爪哇神並沒有絕對清晰的說話...... – irreputable 2011-02-17 18:49:04