2010-07-30 4 views

Antwort

28

Der Trick, der hier verwendet wird, ist, dass die Signaturen von generischen Super-Typen in Unterklassen gespeichert werden und somit überleben löschen.

Wenn Sie eine anonyme Unterklasse erstellen new TypeLiteral<List<String>>() {} Guice kann getClass().getGenericSuperclass() auf sie anrufen und eine java.lang.reflect.ParameterizedType bekommen, auf dem ein Verfahren existiert getActualTypeArguments()List<String> als Instanz von ParameterizedType zu bekommen.

7

Durch eine Kombination von anonymen Typen, Unterklassenbildung und der Tatsache, dass Java ALLE generischen Deklarationen nicht vollständig löscht.

Wenn Sie genau hinsehen, hat TypeLiteral einen geschützten Konstruktor, daher verwenden Sie ein zusätzliches {}, wenn Sie ein neues erstellen, das eine anonyme Unterklasse von TypeLiteral erstellt.

In Java werden generische Deklarationen für Klassen- und Methodendeklarationen beibehalten, also wenn ich dies schreibe.

public abstract class Class1<T> 
{ 
} 

public class Class2 extends Class1<Integer> 
{ 
} 

Ich kann tatsächlich Code in Class1 schreiben, dass sein eigenen generischen Typ herausfinden kann, Integer ist, wenn Class2 die Unterklasse ist.

Überprüfen Sie die API java.lang.Class für die entsprechenden Methoden (sie haben Generic im Namen).

Verwandte Themen