Java Collection mit generischer Methode und Unterklassen

9

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

%Vor%

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

    
Fed03 26.03.2017, 17:19
quelle

1 Antwort

4

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:

%Vor%

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.

    
Valentin Ruano 27.03.2017, 03:26
quelle

Tags und Links