Im Moment habe ich eine Klasse, die eine bestimmte Sammlung Implementierung enthalten, ähnlich wie das folgende Beispiel:Allgemeine Methoden in Verbindung mit generischen Container
public class Bag {
Set<?> items;
public <T> Set<T> getItems() {
return (Set<T>) items;
}
}
Ich muss jetzt den Behälter verallgemeinern, aber ich habe Schwierigkeiten zu verstehen, wie zu erhalten, die eine ähnliche getItems() Methode:
public abstract class AbstractBag<S extends Collection<?>> {
S items;
public <T> S<T> getItems(){ // <- does not compile
return (S<T>) items;
}
}
Das endgültige Ziel ist, die selbe Tasche oder Beutel mit anderen Behältern zu erhalten, wie folgt:
public class SetBag extends AbstractBag<Set<?>> {}
public class ListBag extends AbstractBag<List<?>> {}
Ist es möglich? Danke.
EDIT: Ich werde mehr Details zur Verfügung stellen, warum (ich denke) dieser Code notwendig ist. Ich habe eine Klasse, die Attribute jeglicher Art unterstützen muss. Diese Attribute sind eine Sammlung von Werten dieses speziellen Typs (z. B. eine Menge von Strings, eine Menge von ganzen Zahlen oder eine Menge von WhateverClass). Ich habe eine Karte, die diese mit einem bestimmten Schlüssel verbundenen Daten speichert. Sie können die Daten dann abrufen, indem Sie den Schlüssel aufrufen und das Rückgabeobjekt korrekt umsetzen. Der Einfachheit halber wird dies durch die oben genannte generische Methode erreicht.
Jetzt muss ich eine zweite Klasse haben, wo der Sammlungs-Typ anders ist. Um Codewiederholung zu vermeiden (viel mehr Code als hier), möchte ich eine abstrakte Klasse erstellen, die die Sammlung als generischen Typ hat (wie AbstractBag), und die zwei Klassen mit unterschiedlichen Containern erhalten (zum Beispiel einen mit Listen und Eins mit Sets) wie für SetBag und ListBag.
Warum möchten Sie typisierte Methoden? Normalerweise wird der Elementtyp im Container parametrisiert. – Bohemian
Dies ist eine zu starke Vereinfachung des eigentlichen Codes. Ich werde die Frage erweitern, um den Grund klarer zu machen, warum ich das brauche. –