Wie parametrieren ich eine erweiterte Sammlung
-
21-08-2019 - |
Frage
Ich habe versucht, die Arraylist-Klasse ohne viel Erfolg zu verlängern. Ich möchte es erweitern, und in der Lage, es zu parametrieren.
So brauchen Sie normalerweise so etwas wie
ArrayList<SomeObject> list = new ArrayList<SomeObject>();
Ich will
MyList<SomeObject> list = new MyList<SomeObject>();
Einfach erstreckt Arraylist funktioniert nicht.
public class MyList extends ArrayList ...
Die, wenn ich versuche, es zu benutzen ich die Fehler
Der Typ MyList ist nicht generisch; es kann nicht mit Argumenten zu parametrieren
Ich habe versucht, Variationen
public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>
ohne Erfolg, wenn ich die subobject hinter dem Klassennamen verwenden, es scheint zu funktionieren, aber versteckt Methoden in der subobject Klasse aus irgendeinem Grunde.
Alle Gedanken oder Vorschläge, wie diese Arbeit richtig zu machen sind willkommen.
Lösung
Sie benötigen einen Typ für den Typ-Parameter angeben, die ArrayList
. Für generische Typparameter ist T
ziemlich häufig. Da der Compiler nicht weiß, was ein T
ist, benötigen Sie einen Typ-Parameter hinzufügen, dass MyList
die Art bestanden haben kann somit erhalten Sie:.
public class MyList<T> extends ArrayList<T>
Darüber hinaus können Sie prüfen, List
Umsetzung und zu einer ArrayList
delegieren, anstatt von ArrayList
vererben. "Objekt-Komposition über Klassenvererbung Favor. [ Design Patterns pg. 20]"
Andere Tipps
public class MyList<T>
extends ArrayList<T>
{
}
MyList<SomeObject> list = new MyList<SomeObject>();
oder
public class MyList
extends ArrayList<SomeObject>
{
}
MyList list = new MyList();
Sie sollten nicht Arraylist erweitern, erweitern AbstractList statt:
public class MyList<T> extends AbstractList<T> {
public int size() {...}
public T get(int index) {...}
}