ArrayList和List接口多态?

ArrayList and List Interface Polymorphism?

我正在使用 opencsv 库的 .readAll 方法,它 return 是 List<String>。我以为List是一个接口,因此不能实例化,那么return怎么可能是一个List<>对象呢?

我认为因为 ArrayList<> 扩展了 List 接口,我可以通过多态性做以下事情:

ArrayList<String[]> transactions = reader.readAll();

其中 .readAll() return 是一个 List<> 对象。但是,它没有像预期的那样工作 List<> 而不是 ArrayList<>.

为什么多态性在这里不起作用,即为什么我不能将 List<> 接口 return 值分配给实现 class ArrayList?以及如何将接口实例化为方法 return 值?

谢谢

多态性的工作顺序与您所理解的相反,这意味着父 class/interface 的任何对象(在本例中为 List)都可以保存子 class 的值(或实现接口的class):

List a = new ArrayList(); //correct
ArrayList b = new List(); //incorrect

so how can it return a List<> object?

您可以将接口用作 return 类型。阅读 this question 进行说明。

有趣的问题。它的答案并不简单。

  1. 我们不能创建一个instance(接口不能实例化)一个接口但是we can make reference of it 它引用它的实现对象 class.

例如:

public List getData(){
  ...
  ...
  ArrayList<String> sArrList = new ArrayList(); 

  ...
  return sArrList;
}

因此,当您 return sArrList 时,它是一个 ArrayList 但您的 return 类型是 List。从第 1 点开始,列表引用指向一个 ArrayList,这就是它的实现。

  1. 但是相反的事情是不可能的。但是为什么?

看,ArrayList 是 List 接口的可靠实现。 List 接口有一些可靠的实现,例如 ArrayList、LinkedList...。

因此,当我们尝试将 List 分配给 ArrayList 时,Java 编译器无法确定它实际上是哪个可靠的实现。它是数组列表还是链表?

所以,你可以通过类型转换来克服这种情况。您确认 java 编译器 ok, don't worry, it is an arraylist. you can perform all arraylist operation here without further thinking :)