为什么arraylist类实现List以及扩展AbstractList?

Ash*_*win 26 java arrays arraylist

实现以及扩展的java.util.ArrayList实现.但是在java文档中你可以看到AbstractList已经实现了List.那么实现List以及扩展AbstractList不是多余的吗? 我的第二个问题 请看下面的代码:ListAbstractList



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

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

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

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

das*_*ght 27

那么实现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>彼此无关.


Psh*_*emo 6

关于你的第一个问题,看看为什么ArrayList有"实现List"?


回答你的第二个问题

java.util.ArrayList<String> a = Arrays.asList(stra);
Run Code Online (Sandbox Code Playgroud)

正如您所提到的那样,Arrays.asList返回自己的AbstractList 实现,不幸的是,此代码的创建者也将此类命名为ArrayList.现在因为我们不能水平投射,但只有垂直返回的数组列表不能被投射到java.utli.ArrayList,java.util.AbstractList或者只有它或它的超类型java.util.List才是你的第一个代码示例工作的原因.