2017-06-20 24 views
0

假設如何在Java中

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

創建一個可調整大小的摘要ArrayList和我做了以下

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

它引發以下錯誤

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

據我得到它這個異常意味着抽象列表不能調整大小。但我需要一個可調整大小的抽象數組列表。有沒有辦法或其他想法。

+3

「據我得到它的這個異常是一種抽象列表不能調整大小。」沒有_abstract list_,但是'Arrays.asList()'返回的是一個固定大小的列表(由數組本身支持)。 – tkausl

+0

你不能修改Arrays.asList(new B(),new C())的結果大小。 –

回答

0

List返回的Arrays.asList不可調整大小。如果你想避免調用Arrays.asList

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

或者:所以,你可以簡單地使用ArrayList

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

Arrays.asList()創建由指定數組支持的固定大小的列表中List
由於它在引擎蓋下使用了一個數組,並且您無法在創建後更改數組的大小,因此無法更改由Arrays.asList()創建的List實例的大小。

如果你想使用Arrays.asList()的方式緩解在你的List添加元素,但你也想在創建後修改它,你應該把它包裝在一個新的ArrayList實例,將它的所有內容複製在ArrayList

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

這是不可修改的,它有一個固定的大小。 – assylias

+0

@assylias你是對的。不好的名詞。 – davidxxx

2

Arrays.asList返回ArrayList但這ArrayList是不一樣java.util.ArrayList,它是一個內部類java.util.Arrays.ArrayList延伸AbstractList

add方法不會被這個內部類覆蓋,這意味着它在AbstractList上調用addAbstractList上的add方法拋出UnSupportedOperationException

爲了使用addAll,您需要使用支持.e.g的addAll的集合。 java.util.ArrayList

使用List<T> list = new ArrayList<T>(Arrays.asList(...)),然後調用addAlladd