//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((;
问候