2009-03-23 8 views
4

Ich habe versucht, die ArrayList-Klasse ohne viel Erfolg zu erweitern. Ich möchte es erweitern und in der Lage sein, es zu parametrisieren.Wie parametriere ich eine erweiterte Collection

Also normalerweise haben Sie so etwas wie

ArrayList<SomeObject> list = new ArrayList<SomeObject>(); 

I

wollen
MyList<SomeObject> list = new MyList<SomeObject>(); 

Einfach erstreckt Arraylist funktioniert nicht.

public class MyList extends ArrayList ... 

Die, wenn ich versuche, es zu benutzen erhalte ich die Fehler

Der Typ MyList nicht generisch ist; es kann nicht mit Argumenten <Someobject>

ich ohne Erfolg versucht haben

public class MyList extends ArrayList<Object> 
public class MyList<SubObject> extends ArrayList<Object> 

Variationen parametriert werden, wenn ich die subobject hinter dem Klassennamen verwenden, es scheint zu funktionieren, aber versteckt Methoden in der Unterobjektklasse aus irgendeinem Grund.

Irgendwelche Gedanken oder Vorschläge, wie man diese Arbeit richtig machen kann, werden geschätzt.

Antwort

12

Sie müssen einen Typ für den Typparameter ArrayList angeben. Für generische Typparameter ist T ziemlich üblich. Da der Compiler nicht weiß, was ein T ist, benötigen Sie einen Parameter vom Typ MyList hinzuzufügen, die die Art bestanden haben kann somit erhalten Sie:.

public class MyList<T> extends ArrayList<T> 

Zusätzlich können Sie List betrachten wünschen Umsetzung und delegiert an eine ArrayList, anstatt von ArrayList erben. "Objekt-Komposition über Klassenvererbung Favor [Design Patterns S. 20.]."

3
public class MyList<T> 
    extends ArrayList<T> 
{ 
} 

MyList<SomeObject> list = new MyList<SomeObject>(); 

oder

public class MyList 
    extends ArrayList<SomeObject> 
{ 
} 

MyList list = new MyList(); 
1

Sie sollten nicht verlängern Arraylist, erweitern AbstractList statt:

public class MyList<T> extends AbstractList<T> { 
    public int size() {...} 
    public T get(int index) {...} 
}