为什么数组列表类实现List并扩展抽象List?

2022-09-01 07:35:12

实现以及扩展的实现。但是在java文档中,你可以看到 AbstractList 已经实现了 List。那么,实现 List 和扩展 AbstractList 不是多余的吗?
我的第二个问题

请看下面的代码:java.util.ArrayListListAbstractList

String str = "1,2,3,4,5,6,7,8,9,10";
String[] stra = str.split(",");
List<String> a = Arrays.asList(stra);

Arrays 类的方法包含它自己的 ArrayList 实现。但是这个只是扩展了 AbstractList,而没有实现 List。但是上面的代码编译了。
但是当代码修改为以下内容时Arrays.asList()

String str = "1,2,3,4,5,6,7,8,9,10";
String[] stra = str.split(",");
java.util.ArrayList<String> a = Arrays.asList(stra);

我收到一个错误:
这背后的原因是什么?
EDIT
确实返回了自己的 ArrayList 实现。看看这个cannot convert form List<String> to ArrayList<String>Arrays.asList()


答案 1

那么,实现 List 和扩展 AbstractList 不是多余的吗?

是的,它是100%冗余的。但是,Java实现者在集合库的所有公共实现中都非常一致地添加了接口:

  • LinkedList<E>并扩展哪个实现,然后实现自己。ArrayList<E>AbstractList<E>List<E>List<E>
  • HashSet<E>并扩展哪个实现,然后实现自己。TreeSet<E>AbstractSet<E>Set<E>Set<E>
  • HashMap<K,V>并扩展哪个实现,然后实现自己。TreeMap<E>AbstractMap<K,V>Map<K,V>Map<K,V>

我的理解是,他们这样做是出于文档目的:作者想证明这主要是一个;扩展的事实是其实现中不太重要的细节。其他公共集合类型也是如此。ArrayList<E>List<E>ArrayList<E>AbstractList<E>

请注意,类不是公开可见的,因此其作者并不介意显式包含。Arrays.ArrayList<E>List<T>

就失败的转换而言,这应该不足为奇,因为内部类和公共类彼此无关。Arrays.ArrayList<E>ArrayList<E>


答案 2

对于您的第一个问题,请看一下为什么ArrayList有“实现列表”?


回答第二个问题

java.util.ArrayList<String> a = Arrays.asList(stra);

正如你所提到的,它返回了它自己的 AbstractList 实现,不幸的是,这个代码的创建者也命名了这个类 ArrayList。现在,由于我们不能水平转换,而只能垂直返回的数组列表不能强制转换为,而只能强制转换为或其超类型,因此您的第一个代码示例可以正常工作。Arrays.asListjava.utli.ArrayListjava.util.AbstractListjava.util.List