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异常
尝试运行以下代码:
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 的转换是不相关的/不可用的,反之亦然。
如果你想要演员,第二种方法显然是错误的.它实例化一个新的ArrayList.
但是,当且仅当getAllTasks返回ArrayList时,第一种方法才能正常工作.
你真的需要一个ArrayList吗?List接口不够用吗?如果类型不正确,您正在做什么可能会导致运行时异常.
如果getAllTasks()返回一个ArrayList,你应该更改类定义中的返回类型,然后你不需要强制转换,如果它返回别的东西,你就不能转换为ArrayList.
试试这个:
ArrayList<SomeClass> arrayList;
public SomeConstructor(List<SomeClass> listData) {
arrayList.addAll(listData);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83672 次 |
| 最近记录: |