2017-06-23 10 views
0

テストテスト=新しいテスト(){}; {}には何もありません。なぜ結果が異なるのですか。Javaジェネリックと反射、なぜ異なる結果

public class Test<T> { 
    private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) {}; 
    private final Type type = typeToken.getType(); 

    public void foo() { 
     System.out.println(this.type); 
    } 

    public static void main(String[] args) { 
     Test<Integer> test = new Test<Integer>() {}; 
     Test<Integer> test2 = new Test<Integer>(); 
     test.foo();// class java.lang.Integer 
     test2.foo();//T 
    } 
} 
+1

結果は何ですか?どのように違うのですか?あるケースでは 'Test'のインスタンスを作成し、もう一方では' Test'の無名サブクラスのインスタンスを作成していることに注意してください。 –

答えて

1

あなたはこの

Test test = new Test() {}; 

を書くとき、あなたがあなたのために新しい匿名型を作成するようにコンパイラに指示するので、結果が異なっています。型はTestから派生し、そのメソッドをオーバーライドできます(ただし、そうする必要はありません)。

あなたのケースでは、タイプはメソッドをオーバーライドしませんが、異なるタイプです。

+0

私はあなたがそのメソッドを_overrideで何をしようとしているのか分かりません。明確にすることはできますか? –

+0

@SotiriosDelimanolis OPの混乱は、 'new'式の後に括弧で囲まれた匿名クラスを作成するための構文を理解していないことに由来します。これらの中括弧内にメソッドオーバーライドを配置することをポイントしていますが、Java構文を使用すると、それ以上の特殊化を行わずに基本クラスを継承することができます。 – dasblinkenlight

+0

彼らの混乱は一般的な匿名のクラスではないと思います。私は彼らが混乱していると思うのは、匿名クラスインスタンスの型引数を返す 'TypeToken'動作と、他の型インスタンスの型パラメータ' T'です。 –

関連する問題