Es ist definitiv möglich, es aus % co_de zu extrahieren % , weil es nicht während der Laufzeit definiert ist, sondern während der Kompilierungszeit von Class#getGenericSuperclass()
.
Hier ist ein Kickoff-Beispiel, wie Sie den gewünschten generischen Supertyp im Konstruktor der abstrakten Klasse extrahieren können, indem Sie eine Hierarchie von Unterklassen berücksichtigen (zusammen mit einem realen Anwendungsfall für generische FooDao extends BaseDao<Foo>
-Methoden ohne die muss den Typ explizit angeben):
Eigentlich ist das nicht so einfach wie es scheint. Es gibt ein Problem, wenn Sie eine Rich Type-Hierarchie haben und generische Parameter im Supertype erhalten möchten. Beispielsweise haben Sie möglicherweise die folgende Hierarchie:
%Vor% Aufruf von getClass().getGenericSuperclass()
in einer Instanz von MyDao
gibt SpecialDao<TypeImpl, EntityImpl>
zurück, aber wenn Sie es in BaseDao
method aufrufen, wissen Sie nicht, wie tief die generische Hierarchie ist. Außerdem, soweit ich weiß, können Sie keinen generischen Supertyp eines Supertyps erhalten. Wenn Sie also getClass().getGenericSuperclass().getRawType().getGenericSuperclass()
aufrufen (wobei einige Typumwandlung aus Gründen der Lesbarkeit weggelassen wurde), erhalten Sie BaseDao<E>
(notice <E>
anstelle von <T>
). Da getRawType()
alle Typ-Variablen-Mappings vom Typ entfernt, beginnen wir mit den nicht zugeordneten Typ-Variablen X
und E
. Dann ordnet getGenericSuperclass()
diese Typvariablen nur ihren Positionen in BaseDao
zu.
Dieses Verhalten kann verwendet werden, damit wir beim Durchqueren der Typhierarchie die Zuordnung von Typvariablen zu ihren tatsächlichen Werten beibehalten. Wenn wir die Klasse treffen, die wir wollen, suchen wir einfach ihre Typparameter in der Karte nach. Hier ist der Code:
%Vor%Wenn Ihre Klasse abstrakt ist, können Sie Folgendes versuchen:
%Vor%Dies funktioniert nur, wenn die Instanz eine direkte Unterklasse ist und der Typ der gewünschten Klasse der erste ist (siehe [0]).
Wenn Sie eine große Hierarchie von Daos haben, können Sie versuchen, das BaseDao rekursiv zu fidn und den parametrisierten Typ
zu erhaltenSehen Sie ein Beispiel hier (siehe die Ausgabe unten)
Prost und Entschuldigung für mein schlechtes Englisch