5

我有这个:

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)

问题:我明白为什么会收到此异常。这是因为正在使用ArrayList内部的类,Arrays.java它没有remove()方法。我的问题是某人(任何用户,像我一样)在使用List他们收到的它不包含remove方法之前如何知道?

4

5 回答 5

8

没有办法知道。更改列表的所有List<T>方法都列为可选方法。子类可以实现也可以不实现。不幸的是,API 不包含类似 的方法isReadOnly(),因此无法检查这些方法是否会在不调用它们的情况下引发异常。

只读列表的所有者有责任不将其传递给试图更改它的方法。

于 2014-09-26T05:50:11.830 回答
1

只要接口实现得当,写一个抛出异常的remove方法是完全合法的。所以,不,你不会知道,直到它坏掉……那是 Javadoc 派上用场的时候。

于 2014-09-26T05:53:49.600 回答
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);
  }
}

是对您的问题的一个很好的解释。

希望这可以帮助。

于 2014-09-26T06:01:31.827 回答
0

Arrays.asList返回List一个array. 这个包装器有一个固定的大小,并且直接由 the 支持,array因此不能有修改方法。所以最好记住,否则我不确定如何知道它,因为至少在编译时你不会得到错误。

如果要从数组中获取 Collection 进行修改,可以使用

Collection c = new ArrayList(Arrays.asList(values));
于 2014-09-26T05:51:27.393 回答
0

那么你所做的就是像这样直接返回。前任。数组以简单的方式像这样的字符串数组 [] 表示它的返回数组现在告诉我无论如何要从我的意思是从数组中删除该元素?仅属于列表

一种可能的方法是。

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.
  }
}
于 2014-09-29T05:29:47.727 回答