【发布时间】:2013-07-11 16:24:54
【问题描述】:
使用数组列表和列表有什么区别。实际上,当我想用 istself 实例化 List 时,Java 会抛出一个异常,实际上我必须使用 ArrayList 来实现。
【问题讨论】:
-
您确定自己在实例化列表时遇到异常而不是编译时错误吗?
使用数组列表和列表有什么区别。实际上,当我想用 istself 实例化 List 时,Java 会抛出一个异常,实际上我必须使用 ArrayList 来实现。
【问题讨论】:
您的代码引发异常,因为 List 是抽象的,您无法实例化抽象的东西。
列表是一个接口。在这里你定义合约这个类型的行为签名。
ArrayList 是一个 List ,因为implements List,ArrayList 是一个具体的实现 所以所有的方法都由 List 接口定义。
在 Java 中,您显然可以实例化一个创建 anonymous classes 的接口,但您确实有一个具体的类来实现 List 无名称合同(这就是匿名名称的原因)。
这是一个例子
List list = new List(){
@Override
public boolean add(Object arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public void add(int arg0, Object arg1) {
// TODO Auto-generated method stub
}
@Override
public boolean addAll(Collection arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean addAll(int arg0, Collection arg1) {
// TODO Auto-generated method stub
return false;
}
@Override
public void clear() {
// TODO Auto-generated method stub
}
@Override
public boolean contains(Object arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean containsAll(Collection arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object get(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int indexOf(Object arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public int lastIndexOf(Object arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public ListIterator listIterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public ListIterator listIterator(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean remove(Object arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object remove(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean removeAll(Collection arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean retainAll(Collection arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object set(int arg0, Object arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public List subList(int arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object[] toArray() {
// TODO Auto-generated method stub
return null;
}
@Override
public Object[] toArray(Object[] arg0) {
// TODO Auto-generated method stub
return null;
}
};
正如@Bohemian 所说,如果您制作自己的列表实现,则必须注意Liskov Substitution Principle,不要违反此规定并遵守合同。
【讨论】:
List 是一个 abstract 类型 - java interface。接口定义了可以在实现List 的对象上找到哪些方法。
ArrayList 是List 接口的具体实现(它在内部使用数组来存储元素,因此得名)。
ArrayList 是List,但List 不一定是ArrayList。还有其他实现,比如LinkedList。
【讨论】:
列表是一种通用类型的对象,称为接口。列表的类型很多,包括但不限于 ArrayList 和 LinkedList。列表接口为操作列表所需的一组方法提供句柄,而无需知道它是什么类型的列表。任何类型的列表都可以分配给 List 类型的变量。但是 list 本身不能被实例化,因为它只是一个接口而不是一个实现。有关更多信息,请参阅 Java 列表教程。 http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html
【讨论】:
List是一个接口,ArrayList是一个实现List的类。你不能实例化一个接口。
【讨论】: