Geschachtelte Typenparameter in Java

8

Dies ist ein Beispiel, das ich als Vereinfachung meines realen Codes erfunden habe, also entschuldige ich mich, wenn es ein wenig erfunden ist. Was ich tun möchte, ist, effektiv zwei Typparameter aus einem verschachtelten Argument zu bekommen. Ich bin mir ziemlich sicher, dass das unmöglich ist, aber ich dachte, ich würde es versuchen.

%Vor%

Ich weiß, dass ich es tun könnte, indem ich einen anderen Typparameter hinzufüge:

%Vor%

aber dann muss ich das redundante hinzufügen:

%Vor%

Und in meinem realen Fall können meine Generika manchmal in der implements-Klausel wie

angegeben werden %Vor%

Die Angabe des zweiten Typparameters ist noch schmerzhafter, weil es so aussieht, als würde es die Implementierungsdetails in mein Gesicht werfen. Muss sagen

%Vor%

wenn schon eine Beziehung zwischen String und Bar besteht, scheint einfach unelegant. Ich verstehe, dass es Java ist, also das passt zum Territorium, aber nur neugierig, ob es dafür eine Lösung gibt.

    
Russell Leggett 08.11.2011, 23:27
quelle

3 Antworten

6

Es ist nicht möglich und ich denke nicht, dass es sowieso ideal ist, weil es in Ihrer bestehenden Klasse nichts gibt, was Invarianz erfordert.

%Vor%

könnte allgemeiner gesagt

sein %Vor%

wenn der einzige Grund, T zu haben, eine Mutation der Sammlung zulässt.

Wenn Sie Bedenken haben, zwei Typparameter häufig angeben zu müssen, können Sie eine flache Unterklasse erstellen:

%Vor%

und Sie können Factory-Methoden verwenden, um zu vermeiden, dass Sie zur Erstellungszeit doppelt angeben müssen

%Vor%

Sie können die Schnittstelle auch in ein interface abstrahieren, um die Vorteile von präzisen Typen zu erhalten, die Sie mit DerivedFoo oben erhalten.

    
Mike Samuel 08.11.2011 23:31
quelle
2

Warum würden Sie nicht einfach T als einzigen Typparameter verwenden, wie in:

%Vor%     
antlersoft 08.11.2011 23:32
quelle
2

Vor Java7 geben Konstruktoren keine Inferenz ein. Die Problemumgehung besteht darin, eine statische Factory-Methode zu verwenden. Das ist nicht mehr nötig. In Java 7 können Sie

%Vor%

In Bezug auf T und C , wenn wir 2 Typparameter mit Einschränkungen zwischen ihnen haben, muss es ein gewisses Maß an Redundanz geben. Da in Ihrem Beispiel ein Parameter C den anderen Parameter T vorgibt, scheint die Redundanz unerträglich zu sein. Ich sehe keine Lösung.

Aber Sie können sich wahrscheinlich besser fühlen, wenn die Typparameter neu geordnet werden

%Vor%

also deklarieren wir String first; Geben Sie dann ein Baz<String> an, das ist Bar

    
irreputable 09.11.2011 02:01
quelle