2011-02-17 38 views

回答

9

我懷疑編譯器有效地利用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可應用於該部分。

+3

爪哇神並沒有絕對清晰的說話...... – irreputable 2011-02-17 18:49:04

0

T被推斷爲是一個字符串,因爲G的通用返回類型()被用作f的返回類型(),它是強類型爲字符串。爲了使語句有效,T必須是一個字符串,所以它是。

0

因爲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會很好地編譯,因爲它會從返回類型推斷出類型。我不會編譯,因爲類型不匹配。