2017-06-20 6 views
0

AngenommenWie eine veränderbare Zusammenfassung Arraylist in Java

class A{} 
Class B extends A{} 
Class C extends A{} 
Class D extends A{} 
Class E extends A{} 

erstellen Und ich folgendes

List<A> list1 = Arrays.asList(new B(), new C()); 
List<A> list2 = Arrays.asList(new D(), new E()); 
list1.addAll(0, list2); 

Es führt den folgenden Fehler

java.lang.UnsupportedOperationException 
    at java.util.AbstractList.add(AbstractList.java:148) 
    at java.util.AbstractList.addAll(AbstractList.java:260) 

Soweit ich es bekommen Diese Ausnahme bedeutet, dass eine abstrakte Liste nicht in der Größe geändert werden kann. Aber ich brauche eine resizable Abstract Array List. Gibt es einen Weg oder irgendeine andere Idee?

+3

„Soweit ich es diese Ausnahme bedeutet eine abstrakte Liste kann nicht geändert werden.“ Es gibt keine _abstract-Liste_, aber was 'Arrays.asList()' zurückgibt, ist eine Liste fester Größe (die vom Array selbst unterstützt wird). – tkausl

+0

Sie können die Größe eines Ergebnisses von Arrays.asList nicht ändern (neues B(), neues C()) –

Antwort

0

Die von Arrays.asList zurückgegebene List kann nicht in der Größe geändert werden. Also könnte man einfach ein ArrayList verwenden:

List<A> list1 = new ArrayList<> (Arrays.asList(new B(), new C())); 

Oder wenn Sie den Anruf Arrays.asList vermeiden wollen:

List<A> list1 = new ArrayList<>(); 
Collections.addAll(list1, new B(), new C()); 
0

Arrays.asList() ein List mit einer durch das angegebene Array gesichert feste Größe Liste erstellt.
Da es unter der Haube ein Array verwendet und Sie die Größe des Arrays nicht ändern können, nachdem es einmal erstellt wurde, können Sie die Größe der List Instanz nicht ändern, die von Arrays.asList() entweder erstellt wird.

Wenn Sie Arrays.asList() verwenden möchten den Weg zu erleichtern, um das Hinzufügen Element in Ihrem List aber Sie wollen auch sie nach ihrer Gründung ändern, sollten Sie es in einem neuen ArrayList Instanz wickeln, dass alle Elemente in der ArrayList kopiert :

List<A> list1 = new ArrayList<>(Arrays.asList(new B(), new C())); 
List<A> list2 = Arrays.asList(new D(), new E()); 
list1.addAll(0, list2); 
+0

Es ist nicht unveränderbar, es hat eine feste Größe. – assylias

+0

@assylias Sie haben Recht. Schlechter Begriff. – davidxxx

2

Arrays.asList gibt ein ArrayList aber ArrayList ist nicht das gleiche wie java.util.ArrayList es eine interne Klasse ist java.util.Arrays.ArrayList die AbstractList erstreckt.

Die Methode add wird von dieser internen Klasse nicht überschrieben, was bedeutet, dass sie add auf der AbstractList aufruft. Die add Methode auf der AbstractList löst UnSupportedOperationException. Um die addAll zu verwenden, müssen Sie eine Sammlung verwenden, die addAll für .e. java.util.ArrayList

Verwenden List<T> list = new ArrayList<T>(Arrays.asList(...)) und rufen Sie dann addAll oder add