2016-08-16 14 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とgenericsのコンパイルエラー

答えて

4

gこのパラメータはインターフェイスIに対してのみ宣言されているため、署名に汎用タイプのパラメータTを使用することはできません。あなたはおそらくにその署名を変更する必要があり

:ジェネリック型情報がコンパイル時に消去されているので

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

i instanceof I<Integer>は、コンパイルを通らないので、実行時には利用できません。

これは、コンパイラがわかります正確に何である:

は、パラメータ化された型A.I<Integer>に対してinstanceofのチェックを実行することはできません。ランゲージでさらに一般的なタイプの情報が消去されるため、A.I<?>の形式を使用してください。

+0

"gはそのシグネチャにジェネリック型のパラメータTを使用できません"ので、パラメータ "K"にすることはできますか?なぜあなたは "s"を選んだのですか? – shosh

+1

@shoshあなたは 'S'を選んだ。静的メソッド 'g'のジェネリック型のパラメータ' 'を宣言しました。' s'パラメータと 'i'パラメータの両方に' S'を使うのは意味があるようです。 's'を' i.toInt() ' – Eran

+0

別のオプション: 'public static int g(S s、I i)'。テストされていない、おそらくあなたのメッセージの本文で動作しません。 –