2010-12-06 15 views
5

Ich weiß, dass, um ein Objekt von Arraylist Art zu schaffen, muß ich:Arraylist (Sammlung <? extends E> c)

ArrayList<MyType> l = new ArrayList<MyType>(); 

Ich weiß es, weil ich dies in Büchern gesehen habe.

Aber ein Blick auf Java SE-API für den Arraylist-Konstruktor Ich sehe: ArrayList(Collection<? extends E> c)

Ich verstehe nicht, wie würde ich immer eine Idee, die Art von Objekten Objekt meiner neue Arraylist angeben halten würde? Wie würde ich aus dieser Definition wissen, dass ich bei Instanziierung und Variablendeklaration <MyType> angeben muss?

+1

Wo suchen Sie denn ich sehe: "public Arraylist (Sammlung c)" – jzd

+0

@jzd, das ist, was die OP bereits auf diese Frage stellen .... –

+0

btw Liste l = new Arraylist () verwenden; Es ist nicht falsch, wenn Sie die Implementierungsklasse verwenden, aber es ist besser, die Implementierungsdetails zu verbergen. –

Antwort

3

Um herauszufinden, ob Sie in Ihrer Deklaration Typparameter benötigen, schauen Sie nicht auf den Konstruktor, sondern auf die class definition itself. Die Argumente der Konstruktoren haben nichts mit dem Typ des Objekts selbst zu tun - ein Konstruktor kann wie jede andere Methode beliebige Argumente annehmen. Hier ist die Klassendefinition:

public class ArrayList<E> 
extends AbstractList<E> 
implements List<E>, RandomAccess, Cloneable, Serializable 

Der class ArrayList<E> Teil sagt, dass es eine Klasse namens Arraylist ist und es erfordert einen Typ-Parameter (die E hier genannt wird).

+0

Vielen Dank, jetzt habe ich es. – Eugene

4

Mit dieser Methode wird eine vorhandene Auflistungsinstanz in die neue ArrayList kopiert und nicht von Grund auf neu erstellt. Die Elemente der Sammlung, die akzeptiert werden, haben eine obere Grenze vom Typ E, die dann der Typ Ihrer neuen ArrayList ist.

1

Das ist immer wahr, wenn Sie ein Objekt für eine Klasse erstellen, die einen generischen Typ verwendet. Wenn Sie bis zum Anfang scrollen, sehen Sie Class ArrayList < E>. Das ist der Hinweis.

2

Angenommen, Sie haben eine Reihe von Formklassen. Die Basisklasse ist Shape, und die beiden Implementierungen sind Square und Circle. Jetzt, nachdem Sie eine bestimmte Konfiguration für die Liste der gewünschten Objekte vorgenommen haben, müssen Sie sie alle zusammenfügen, um sie an eine Renderfunktion zu senden. Der Code sollte unter dem machen, was ich beschreibe, ein wenig mehr klar:

ArrayList<Square> squares = readSquares(); 
ArrayList<Circle> circles = readCircles(); 

ArrayList<Shape> queue= new ArrayList<Shape>(squares); 
queue.addAll(circles); 

renderShapes(queue); 

Der ArrayList(Collection<? extends E> c) Konstruktor macht Linie fünf möglich. Bei Generika ist der Prozessor nicht intelligent genug, um automatisch zu bestimmen, dass Square Shape standardmäßig erweitert. Sie müssen dem Compiler sagen, was Sie beabsichtigt haben. Die Art, wie Sie das tun, ist mit dem Platzhalter <? extends E>. Jetzt stellt der Compiler sicher, dass jedes hinzugefügte Objekt mindestens eine Form ist.

Verwandte Themen