2016-06-27 7 views
1

Ich versuche, einen Typparameter zur Laufzeit mit TypeToken wie zeigt, in dem Guava documentation Beispiel zu sehen IKnowMyType:Wie TypeToken verwenden, um Typparameter abzurufen?

public class Test<E extends Enum<E>> { 

    private static enum MyEnum { 
     FIRST, 
     SECOND 
    }; 

    private final TypeToken<E> enumType = new TypeToken<E>(getClass()) { 
    }; 

    public static void main(String[] args) { 
     Test<MyEnum> container = new Test<>(); 
     System.out.println(container.enumType.getRawType()); 
    } 
} 

Wenn ich diesen Code ausführen, bekomme ich class java.lang.Enum als Ausgabe. Warum bekomme ich nicht class MyEnum statt?

Antwort

5

Dieser "Hack" funktioniert nicht mit einem Wert des Laufzeittyps Test.

Es gibt keine Möglichkeit für Java den Typ Argument abgeleitet propagieren, wenn Ihre Test Klasse hier

Test<MyEnum> container = new Test<>(); 

bis auf die Erklärung Instantiieren

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) { 
}; 

Und deshalb die TypeToken hat keine Ahnung, was die E sollte beziehen auf.

Die Javadoc Staaten

Konstrukte ein neuer Typ von Token T während freie Variablen vom Typ im Zusammenhang mit declaringClass lösen.

Clients erstellen eine leere anonyme Unterklasse. Dabei wird der Typ Parameter in die Typhierarchie der anonymen Klasse eingebettet, so dass wir ihn trotz Laufzeit trotz Wiederherstellung wiederherstellen können.

Also das ist, was Sie tun müssen.

Test<MyEnum> container = new Test<MyEnum>() { 
}; 

Nun, da Klassen Informationen über ihre generische Super erhalten, der getClass Aufruf im TypeToken Instanziierung bietet über genügend Kontext für die E als MyEnum interpretiert werden.

+0

Ich verstehe nicht. Worauf bezieht sich "Sample" in Ihrer Antwort? Wollen Sie sagen, dass ich eine Unterklasse 'Sample extends Test' erstellen muss und dann' Sample.enumType' nachschlagen kann? – Gili

+0

@Gili Sorry, ich habe meine eigene Testklasse benutzt. 'Sample' ist dein' Test'. Sie erstellen eine anonyme Unterklasse von 'Test', ja. –

+0

Das funktioniert. Danke mein Herr! :) – Gili