Mehrere Platzhaltergrenzen

8

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?

    
Kelvin Chung 01.09.2012, 17:49
quelle

4 Antworten

2

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

    
irreputable 01.09.2012 22:28
quelle
1

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.

    
davek 01.09.2012 18:20
quelle
1

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:)

    
Guillaume 01.09.2012 19:44
quelle
1

Sie müssen sicherstellen, dass A und B eine gemeinsame Abstammung haben.

%Vor%

oder

%Vor%     
MadProgrammer 01.09.2012 21:46
quelle

Tags und Links