2014-09-26 73 views
5

我有這樣的:如何知道List.remove()是否爲「Unsupported」?

import java.util.Arrays; 
import java.util.List; 
import java.util.ArrayList; 
public class ListTest { 

    public static void main(String[] args) { 


     String[] values = { "yes", "no"}; 
     List<String> aa = Arrays.asList(values); 
     System.out.println(aa.getClass().getName()); 
     aa.remove(0); 
    } 

} 

它提供:

$ java ListTest 
java.util.Arrays$ArrayList 
Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(AbstractList.java:161) 
    at ListTest.main(ListTest.java:12) 

問:我明白爲什麼我得到這個例外。這是因爲Arrays.java內部的ArrayList類正在使用,它沒有remove()方法。我的問題是,在使用List他們收到的信息之前,某人(像我這樣的任何用戶)如何知道它不包含remove方法?

回答

8

有沒有辦法知道。所有更改列表的List<T>方法都列爲可選項。一個子類可以實現它們。不幸的是,API不包含像isReadOnly()這樣的方法,因此無法檢查這些方法是否會在不調用它們的情況下拋出異常。

這是隻讀列表的所有者的責任,不要將它傳遞給試圖更改它的方法。

0

Arrays.asList返回List包裝爲array。該包裝具有固定大小,並直接支持array,因此不能有修改方法。所以更好記住,否則我不知道如何知道它,因爲至少編譯時間,你不會得到一個錯誤。

如果你想從一個陣列得到一個集合修改就可以使用

Collection c = new ArrayList(Arrays.asList(values)); 
+0

OP知道這一點。問題在於,如果不知道列表的具體類型,是否有任何方法可以檢測到這種缺乏實施。 – ApproachingDarknessFish 2014-09-26 05:53:25

1

只要接口正確實施,編寫拋出異常的刪除方法是完全合法的。所以,不,你不知道,直到它打破......這就是當Javadoc來得方便。

1

下面是解

import java.util.Arrays; 
import java.util.List; 
import java.util.ArrayList; 
class ListTest { 
    public static void main(String[] args) { 
     String[] values = { "yes", "no"}; 
     List<String> aa = new ArrayList<>(Arrays.asList(values)); 
     System.out.println(aa.getClass().getName()); 
     aa.remove(0); 
    } 
} 

here是你的問題很好的解釋。

希望這會有所幫助。

+0

您是否在這裏忘記了:'List aa = new ArrayList <>(Arrays.asList(values));' – abc 2014-09-26 06:06:40

+1

No no。這就是「鑽石排除」。只允許在Java 7和更高版本中使用。如果你的java版本高於7,你可以同時使用它。檢查一下。 http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7 – codebot 2014-09-26 06:08:54

0

那麼你做了什麼直接返回這樣。恩。數組以簡單的方式像這樣String array []意味着它的返回數組現在告訴我有無論如何從數組中刪除該元素?即屬於僅列表

一種可能的方式是。

import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays; 

class ListTest { 
    public static void main(String[] args) { 
     String[] values = { "yes", "no"}; 
     List<String> aa = new ArrayList<>(Arrays.asList(values)); // this will return arraylist (according that u wanted). 
     System.out.println(aa.getClass().getName()); 
     aa.remove(0); // removes element as of list interface have remove method. 
    } 
}