我正在查看http://docs.oracle.com/javase/tutorial/collections/custom-implementations/index.html教程,我尝试做同样的事情:
class MyArrayList<T> extends AbstractList<T> {
private final T[] a;
MyArrayList(T[] array) {
a = array;
}
@Override
public T get(int index) {
return a[index];
}
@Override
public T set(int index, T element) {
T oldValue = a[index];
a[index] = element;
return oldValue;
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return (Object[]) a.clone();
}
public static void main(String[] args) {
String[] arr = {"one", "two", "three"};
MyArrayList<String> list = new MyArrayList<String>(arr);
list.get(1);
list.add(1, "seven");
System.out.println(list);
}
}
尝试插入元素时出现异常:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
为什么,我该如何解决?
答案 0 :(得分:9)
您没有覆盖方法add()
。
AbstractList的javadoc说明:
请注意,此实现会抛出UnsupportedOperationException 除非重写add(int,Object)。
修复是...覆盖方法。或者不使用add()
方法,因此MyArrayList
的大小是不可变的(但不是它的值) - 就像数组一样,这就是你存储值的方法。
答案 1 :(得分:1)
来自摘要清单的java documentation:
“要实现可修改的列表,程序员必须另外覆盖set(int,E)方法(否则会抛出UnsupportedOperationException)。如果列表是可变大小的,程序员必须另外覆盖add(int,E)并删除(int)方法。“
您必须覆盖添加方法:)
答案 2 :(得分:0)
如果你想要一个可变列表,你需要实现add
方法。
答案 3 :(得分:0)
add
在列表中是可选的。 AbstractList将它实现为throw和exception。如果你想让它做其他事情,那么你可以简单地覆盖它。
答案 4 :(得分:0)
首先,你真的需要实现一个抽象列表吗?在大多数情况下,java List就足够了。
实现抽象类的烦人部分是你必须实现抛出UnsupportedOperationException的每个方法。