如何解决为什么我可以将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
返回的是列表而不是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
类中的private
,后者是Arrays
Arrays.asList(b1)返回java.util.Arrays.ArrayList类型的对象,该对象是Arrays中的嵌套类。
换句话说,您的问题是为什么不能将类型为java.util.Arrays.ArrayList的b1强制转换为类型为java.util.ArrayList的arrayList1:这是两个完全不同的类型,根本不相关。
如果您需要一个java.util.ArrayList,则可以创建一个副本:
ArrayList arrayList1 =新的ArrayList (Arrays.asList(b1));
致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。