2014-09-26 219 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. 
    } 
}