Ich habe die folgende Auflistungsklasse, die eine Methode zum Gruppieren der Elemente in einer Map enthält, wobei jeder Wert den Typ der Klasse hat, die ihn aufruft
%Vor% Ich möchte in der Lage sein, Unterklassen zu erstellen, die die Methode groupBy
verwenden, die neue Eigenschaften von sich selbst als Map-Werte zurückgibt.
Das Folgende ist ein Beispiel
Das Problem liegt in der Methode groupByPerson
. Der Compiler gibt einen Fehler für den Aufruf groupBy
aus.
Error:(15, 28) java: incompatible types: no instance(s) of type variable(s) K exist so that java.util.Map<K,? extends TaskCollection<Assertion>> conforms to java.util.Map<Person,AssertionCollection>
Ich bin neu in Java, also bin ich mir ziemlich sicher, dass da etwas Dummes ist, das ich nicht sehe
Die Absicht ist, dass für jede Klasse X
, die TaskCollection
erweitert, wenn eine groupBy-Operation ausgeführt wird, die für die map-Werte verwendete Auflistung auch Instanzen der Klasse X
ist.
In diesem Fall ist das Folgende das Folgende:
%Vor% Beachten Sie, dass die obige Definition von TaskCollection
die Unterklassen nicht davon abhält, eine andere TaskCollection
-Klasse für ihre groupBy-Map-Werte zu verwenden. Zum Beispiel würde dies auch kompilieren:
Leider ist es momentan nicht möglich, eine solche Bedingung zu erzwingen, da Sie nicht auf die Klasse verweisen können, die im C-Typ-Parameter-Platzhalter deklariert wird.
Wenn Sie davon ausgehen können, dass Abkömmlinge einen parameterfreien Konstruktor als Sammlungslieferant haben, können Sie eine Standardimplementierung dafür bereitstellen %Code%. Der Preis, den Sie zahlen, ist die Notwendigkeit, eine "ungeprüfte" Warnung (kein echtes Problem) zum Schweigen zu bringen und dass nicht konforme Klassen (die den Parameter-freien Konstruktor nicht bereitstellen) nicht zur Kompilierungszeit ausfallen, sondern zur Laufzeit, was weniger ideal ist :
%Vor% Wenn Sie collectionSupplier
als collectionSupplier
deklarieren, würden Sie Unterklassen zwingen, immer Instanzen ihrer eigenen Klasse mit dem Vorbehalt zurückzugeben, dass eine, dann non-sense-Deklaration wie final
noch kompiliert und Zeitausnahme Ausnahmen auf der Straße.