为什么我能够将Arrays.asList方法与为接口List声明的对象一起使用,而当它被声明为类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类。来自CCD_ 21的一个和来自java.util.Arrays的一个。前者是public,后者是Arrays类内的private

Arrays.asList(b1(返回类型为java.util.Arrays.ArrayList的对象,该对象是Arrays中的嵌套类。

换句话说,您的问题是,为什么类型为java.util.Array.ArrayList的b1不能被强制转换为类型为java.til.ArrayList的arrayList1:这是两种完全不同的类型,根本没有关联。

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

ArrayList arrayList1=新的ArrayList<gt;(数组.asList(b1((;

问候

最新更新