2016-08-16 102 views
2
public class A { 
    public interface I<T> { 
     public Integer toInt(T x); 
    } 
    public static int t(String s, I<String> i) { 
     // System.out.println(i instanceof I<Integer>); 
     return i.toInt(s); 
    } 
    public static <S> int g(S s, I<T> i){ 
     return i.toInt(s); 
    } 
    public static void main (String[] args) { 
     System.out.println(t("dcba", s->(int)(s.charAt(0)+'a'))); 
    } 
} 

爲什麼方法g無法通過編譯?爲什麼方法t中的行System.out.println(i instanceof I<Integer>)無法通過編譯?編譯錯誤instanceof和泛型

回答

4

g不能在其簽名中使用通用類型參數T,因爲該參數僅針對接口I聲明。

您應該其簽名可能更改爲:

public static <S> int g(S s, I<S> i) 

i instanceof I<Integer>因爲泛型類型信息在編譯時刪除不通過編譯,所以它在運行時的不可用。

這正是編譯器會告訴你:

無法執行instanceof檢查對參數化類型A.I<Integer>。使用表格A.I<?>,因爲進一步的通用類型信息將在運行時被刪除

+0

「g不能在其簽名中使用泛型類型參數T」,所以它可以是參數「K」嗎?你爲什麼選擇「s」? – shosh

+1

@shosh你選擇了'S'。你爲靜態方法'g'聲明瞭一個泛型類型參數'',因爲你將's'傳遞給''''參數和'i'參數似乎對's'參數和' i.toInt()'。 – Eran

+0

另一種選擇:'公共靜態 int g(S s,I i)'。未經測試,可能不適用於您的消息正文。 –