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.
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.
Warum würden Sie nicht einfach T als einzigen Typparameter verwenden, wie in:
%Vor%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
Tags und Links java generics nested-generics type-parameter