如何从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。
然而,第一种方法应该工作得很好,当且仅当getAllTasks返回一个ArrayList。
真的需要你有一个ArrayList? 不是List接口吗? 如果types不正确,您正在做的事情可能会导致运行时exception。
如果getAllTasks()返回一个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编译器不会阻止它。
但:
- 将父types转换为子types(或实现types的接口)而不检查是不好的做法。 这样更好:
if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }
- 也许你不需要实现types作为参考。 看SonarQube警告https://sbforge.org/sonar/rules/show/squid:S1319 。 在大多数情况下你可以避免这种铸造。
- 你可以使用Guava方法:
ArrayList<Task> arraylist = Lists.newArrayList(list);