繁体   English   中英

为什么我可以将 Arrays.asList 方法与为接口 List 声明的对象一起使用,但当它被声明为类 ArrayList 的实例时却不能使用?

[英]Why I am able to use Arrays.asList method with an object declared for interface, List, but not when it is declared as an instance of class ArrayList?

//Splitting a string and passing it to a String Array
String[] b1 = a1.split("");

//The Following throws a compile-time error
ArrayList<String> arrayList1 =  new ArrayList<String>();
arrayList1 = Arrays.asList(b1);

//The following works
List<String> arrayList1 =  new ArrayList<String>();
arrayList1 = Arrays.asList(b1);

我想知道为什么第一种方法会引发错误而第二种方法效果很好? ArrayList实现了List接口,所以它应该可以很好地工作。

ArrayList实现了List接口,所以它应该可以很好地工作。

不,这不是它的工作原理。 如果某些东西返回接口的实现,您可以将其分配给声明为该接口的对象,而不是相反。

这就是你在做的时候

List<String> arrayList1 =  new ArrayList<String>();

这是完全合法的。

但是如果asList返回的是 List 而不是 ArrayList 的东西(这就是这里发生的事情)怎么办? 您会收到错误消息,因为您将不是ArrayList (并且不是从它下降)的内容分配给ArrayList

另请注意,只要您执行arrayList1 = Arrays.asList(b1); 在第二个测试中,您将新的ArrayList分配给arrayList1的事实完全无关紧要,因为您将在下一行覆盖它,因此arrayList1只是一个List ,正如声明的那样。

Java 是静态类型的,当你说一个变量是一个String你不能给它分配一个int 你的例子也是如此。 当您将arrayList1声明为ArrayList<String>您不能为其分配List<String> 因为您不能确定从Arrays.asList()返回的值真的是java.util.ArrayList一个实例。

还要注意存在两个名为ArrayList java 类。 一个来自java.util ,另一个来自java.util.Arrays 前者是public ,后者在Arrays类中是private

Arrays.asList(b1) 返回一个 java.util.Arrays.ArrayList 类型的对象,它是 Arrays 中的一个嵌套类。

换句话说,您的问题是为什么无法将类型为 java.util.Arrays.ArrayList 的 b1 转换为类型为 java.util.ArrayList 的 arrayList1 :这是两种完全不同的类型,根本不相关。

如果你需要一个 java.util.ArrayList,你可以创建一个副本:

ArrayList arrayList1 = new ArrayList<>(Arrays.asList(b1));

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM