2017-06-23 4 views
0

Test test = new Test() {}; Es gibt nichts in {}, warum das Ergebnis anders ist.Java Generika und Reflexion, warum anderes Ergebnis

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

Welches Ergebnis? Wo ist der Unterschied? Beachten Sie, dass Sie in einem Fall eine Instanz von "Test" erstellen und in der anderen eine Instanz einer anonymen Unterklasse von "Test" erstellen. –

Antwort

1

Das Ergebnis ist anders, weil, wenn Sie diese Zeilen schreibe

Test test = new Test() {}; 

Sie den Compiler anweisen, eine neue anonyme Art für Sie zu erstellen. Der Typ leitet sich von Test ab und kann (muss aber nicht) seine Methoden überschreiben.

In Ihrem Fall überschreibt der Typ keine Methoden, aber es ist ein anderer Typ.

+0

Ich verstehe nicht, welchen Punkt Sie versuchen, mit dem _override seine Methoden_ zu machen. Könntest Du das erläutern? –

+0

@SotiriosDelimanolis Die Verwirrung von OP kommt davon, dass man die Syntax zum Erstellen anonymer Klassen mit geschweiften Klammern nach 'neuem' Ausdruck nicht versteht, die kein neues Verhalten bieten, d. H. Wenn in geschweiften Klammern nichts ist. Ich versuche zu sagen, dass Sie normalerweise Ihre Methodenüberschreibungen innerhalb dieser geschweiften Klammern platzieren, aber die Java-Syntax erlaubt Ihnen, die Basisklasse ohne weitere Spezialisierung zu erben. – dasblinkenlight

+0

Ich glaube nicht, dass ihre Verwirrung über allgemeine anonyme Klassen ist. Ich denke, dass Verwirrung das 'TypeToken'-Verhalten ist, das das Type-Argument für die anonyme Klasseninstanz und den Typparameter' T' für das andere zurückgibt. –