2012-07-26 4 views
5

Wo können wir ArrayList<? extends My_Class>, weil es nicht zulassen, dass Sie ein neues Element hinzufügen, wenn Sie es so erklären:Wo können wir ArrayList <verwenden? My_class erstreckt>

ArrayList<? extends My_Class> obj=new ArrayList<? extends My_Class>(); 
list.add(new Derived_My_Class()); //this is compilation error 
+0

möglich Duplikat erklärt [Wie können Elemente einer Wildcard generische Sammlung hinzugefügt werden?] (http://stackoverflow.com/questions/176446/how-can-elements- werden schöpf-to-a-Wildcard-generic-Sammlung) –

Antwort

5

Die weit verbreitete Abkürzung diese Schlüsselwörter für die Beschreibung ist: PECS: Produzent erweitert - Verbraucher super.

Also, wenn Sie "erweitert" verwenden, erzeugt Ihre Sammlung Elemente des angegebenen Typs. Sie können also nicht hinzufügen, Sie können nur davon nehmen.

public List<? extends CharSequence> getFoo() { 
    List<String> list = new ArrayList<String>(); 
    list.add("foo"); 
    return list; 
} 

Verwandte: Java generics: Collections.max() signature and Comparator

+0

Was ist der Vorteil, den wir versuchen, aus ihm heraus zu bekommen ich verstehe nicht, weil der Anrufer dieses Verfahrens auch eine Variable vom Typ Liste definieren sollte nicht einmal Liste und später auch können Sie die empfangene Variable nicht ändern, deshalb verstehe ich nicht, warum brauchen wir es – user1554627

2

Sie sind richtig, Ihre ArrayList kann nicht verwendet werden, um die Art und Weise sie abgeleitet ist: es

einen Client Ihrer API mit einer Liste Ein Beispiel für die Verwendung zur Verfügung zu stellen wäre ist nichts, was man hineinstecken kann.

Was Sie für die Speicherung My_Class und seiner Unterklassen wollen, ist einfach ArrayList<My_Class>; es werden die Objekte von My_Class nehmen und alle seine DerivedClass richtig.

0

Nun ja ... Es hat keinen Sinn, man wird Arraylist wie diese erklären, vielmehr wird Ihre Absichten, indem er

Arraylist < Supertype> obj = new Arraylist < Supertype>() erfüllt werden;

Gemäß meiner Erfahrung habe ich diesen Begriff in Methodenargumenten gesehen, wo Sie erwarten, dass Ihr Aufrufer eine Sammlung von Subtypen bestimmter Supertype bereitstellt (oder von einer Methode ebenfalls wie oben beschrieben zurückkehrt). wie wie folgt

public getAnimals(List< ? extends Animal> obj){ 

obj.add(something); //not allowed 

} 

gibt es faire Chancen, dass Sie Esel, Affen und Vögel usw. in Ihrer Liste der bestimmten Art sagen (Monkey) hinzufügen können. und bekomme classCastException, wenn du davon kommst.

Deshalb ist es in diesem Fall nicht erlaubt. Lesen Sie Effektives Java von Josh Bloch. er hat es gut mit dem Produzenten Verbraucher Analogie (PECS)

+0

Ahm ... Was? Ja, genau das möchte ich in bestimmten Fällen. Hat adressieren die Frage nicht –

+0

der Annahme, dass Esel, Affen und Vögel, alle von ihnen stammen aus 'Tier: ein Tier dann ... was ist das Problem für sie in einem' 'Arraylist speichern ?? und ... wo ist die potentielle Katastrophe? –

+0

Ich erwarte nicht, dass ich so dumm bin. Es tut mir leid..refer aktualisierte Antwort – Ahmad

Verwandte Themen