如何从List <>中转换ArrayList <>

Eug*_*ene 39 java generics casting

可有人请解释一下我为什么不能投List<>ArrayList<>与第一种方法,我做第二个?谢谢.

第一种方法:

ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token));
Run Code Online (Sandbox Code Playgroud)

第二种方法:

ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));
Run Code Online (Sandbox Code Playgroud)

cor*_*iKa 29

当你做第二个时,你正在制作一个新的arraylist,你不是在试图假装另一个列表是一个arraylist.

我的意思是,如果将原始列表实现为链接列表或某些自定义列表,该怎么办?你不会知道的.如果你真的需要从结果中创建一个arraylist,那么第二种方法是首选.但你可以把它留作列表,这是使用Interfaces的最大优势之一!


Har*_*rsh 14

当您使用第二种方法时,您正在使用其预定义值初始化arraylist.像一般我们做ArrayList listofStrings = new ArrayList <>(); 假设您有一个包含值的数组,现在您想将此数组转换为arraylist.

你需要首先使用Arrays utils从数组中获取列表.因为ArrayList是实现List接口的具体类型.不保证方法asList会返回这种类型的实现.

List<String>  listofOptions = (List<String>) Arrays.asList(options);
Run Code Online (Sandbox Code Playgroud)

然后你可以使用arraylist的构造函数来实例化预定义的值.

ArrayList<String> arrlistofOptions = new ArrayList<String>(list);
Run Code Online (Sandbox Code Playgroud)

因此,您的第二种方法是工作,您已经传递了值,这些值将使用列表元素来实现arraylist.

更多

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

UnsupportedOperationException异常


reb*_*yum 6

尝试运行以下代码:

List<String> listOfString = Arrays.asList("Hello", "World");
ArrayList<String> arrayListOfString = new ArrayList(listOfString);
System.out.println(listOfString.getClass());
System.out.println(arrayListOfString.getClass());
Run Code Online (Sandbox Code Playgroud)

你会得到以下结果:

class java.util.Arrays$ArrayList
class java.util.ArrayList
Run Code Online (Sandbox Code Playgroud)

所以,这意味着它们是 2 个不同的类,它们不会相互扩展。java.util.Arrays$ArrayList 表示名为 ArrayList 的私有类(Arrays 类的内部类),java.util.ArrayList 表示名为 ArrayList 的公共类。因此,从 java.util.Arrays$ArrayList 到 java.util.ArrayList 的转换是不相关的/不可用的,反之亦然。


krt*_*tek 5

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

但是,当且仅当getAllTask​​s返回ArrayList时,第一种方法才能正常工作.

你真的需要一个ArrayList吗?List接口不够用吗?如果类型不正确,您正在做什么可能会导致运行时异常.

如果getAllTask​​s()返回一个ArrayList,你应该更改类定义中的返回类型,然后你不需要强制转换,如果它返回别的东西,你就不能转换为ArrayList.


vik*_*mar 5

试试这个:

ArrayList<SomeClass> arrayList;

 public SomeConstructor(List<SomeClass> listData) {
        arrayList.addAll(listData);
}
Run Code Online (Sandbox Code Playgroud)