如何从List <>投射ArrayList <>

有人可以解释我为什么我不能将第一种方法将List<>ArrayList<> ,而我使用第二种方法呢? 谢谢。

第一种方法:

 ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token)); 

第二种方法:

 ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token)); 

当你做第二个,你正在做一个新的数组列表,你不是想假装另一个列表是一个数组列表。

我的意思是,如果原始列表是作为一个链表或一些自定义列表实现的呢? 你不会知道的 第二种方法是首选,如果你真的需要从结果进行arrays列表。 但是你可以把它作为一个列表,这是使用接口的最好的优点之一!

当你使用第二种方法时,你正在用它的预定义值初始化arraylist。 就像我们通常做的ArrayList listofStrings = new ArrayList <>(); 假设你有一个数组的值,现在你想把这个数组转换成数组列表。

您需要先使用Arrays utils从数组中获取列表。 因为ArrayList是实现List接口的具体types。 不保证方法asList,将返回这种types的实现。

 List<String> listofOptions = (List<String>) Arrays.asList(options); 

那么你可以使用用户constructoru的一个数组列表来实例化预定义的值。

 ArrayList<String> arrlistofOptions = new ArrayList<String>(list); 

所以你的第二种方法是工作,你已经传递值列表元素list列表。

更多

从Arrays.asList返回的ArrayList不是一个实际的数组列表,它只是一个不允许在列表中进行修改的包装器。 如果你尝试添加或删除Arrays.asList它会给你

UnsupportedOperationExceptionexception

第二种方法显然是错误的,如果你想演员。 它实例化一个新的ArrayList。

然而,第一种方法应该工作得很好,当且仅当getAllTask​​s返回一个ArrayList。

真的需要你有一个ArrayList? 不是List接口吗? 如果types不正确,您正在做的事情可能会导致运行时exception。

如果getAllTask​​s()返回一个ArrayList,则应该在类定义中更改返回types,然后不需要强制转换,如果返回其他值,则不能强制转换为ArrayList。

试试这个:

 ArrayList<SomeClass> arrayList; public SomeConstructor(List<SomeClass> listData) { arrayList.addAll(listData); } 

第一种方法是尝试转换列表,但只有当List<>ArrayList<>才能工作。 事实并非如此。 所以你需要第二种方法,即用List<>的元素构build一个新的ArrayList<> List<>

因为在第一个中,你试图把一个集合转换成一个ArrayList。 在第二个中,您只需使用ArrayList的内置构造函数

如果你明白你在做什么,你可以把List <>转换成ArrayList <>。 Java编译器不会阻止它。

但:

  1. 将父types转换为子types(或实现types的接口)而不检查是不好的做法。 这样更好:

if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }

  1. 也许你不需要实现types作为参考。 看SonarQube警告https://sbforge.org/sonar/rules/show/squid:S1319 。 在大多数情况下你可以避免这种铸造。
  2. 你可以使用Guava方法: ArrayList<Task> arraylist = Lists.newArrayList(list);