Angenommen, ich habe die folgende Klasse:
%Vor% Either
ist ein Typ, der ein Objekt vom Typ A oder B speichert. get()
ruft das eine Objekt ab.
Die Frage ist, ob es möglich ist, Generics zu verwenden, um die Methodensignatur von get()
zu ändern, so dass der zurückgegebene Typ nicht nur Object
ist, sondern ein allgemeiner Supertyp von A und B. Zum Beispiel ein Either<Integer, Long>
kann get()
return Number
haben, ein Either<Deque<T>, Set<T>>
kann get()
return Iterable<T>
oder Collection<T>
haben und so weiter. (Offensichtlich sollte Either<Foo,Foo>
get()
return Foo
haben).
Wenn das überhaupt möglich ist, wenn ich Either<List<A>, List<B>>
hätte, was ist der spezifischste Typ, den get()
zurückgeben kann? Ist es rohe List
, Wildcard List<?>
oder etwas ganz anderes?
Java-Schlussfolgerung haben etwas ähnliches, wir können
tun %Vor%Es gibt jedoch wahrscheinlich keine Möglichkeit, daraus eine Instanzmethode zu machen. Wir müssten schreiben
%Vor%wird in Java nicht unterstützt
Warum definieren Sie nicht eine abstrakte Klasse C, die so viel Logik enthält wie A und B, die Sie für notwendig halten, und auf die in Ihrer Eat-Klasse verweisen:
%Vor% Das scheint keine große Antwort zu sein, aber da Java Ihre Typinformationen sowieso beim Kompilieren löscht (das heißt, Ihr kompilierter Code sieht nur Object
anstelle von A
oder B
) , dann sind Sie am besten in der Lage zu definieren, was in einer expliziten gemeinsamen Klasse beibehalten werden sollte.
Soweit ich weiß, ist es nicht möglich: Ihre Either<A,B>
-Klasse macht eine Annahme über einen generischen dritten Typ (nennen wir es C
), die sowohl A als auch B erweitern würde: während es möglich ist zu schreiben etwas wie public class Either<A extends MyNonFinalClass, B extends MyNonFinalClass> {}
, Java erlaubt keinen Vorwärts-Verweis auf einen generischen Typ, so dass Sie nicht einmal etwas wie Either<A extends C, B extends C, C>
schreiben können. Offensichtlich eine Schande, wie Ihre Either
-Klasse wirklich praktisch wäre:)
Sie müssen sicherstellen, dass A und B eine gemeinsame Abstammung haben.
%Vor%oder
%Vor%Tags und Links java generics bounded-wildcard