2011-02-27 39 views
35

有人可以请解释我为什么我不能投第List<>ArrayList<>第一种方法,我做第二个?谢谢。如何投射ArrayList <>从列表<>

第一种方法:

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

第二种方法:

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

回答

23

当你做第二个,你正在做一个新的ArrayList,你不试图假装另一名单一个阵列列表。

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

1

第一种方法是尝试投射清单,但只有在List<>ArrayList<>时才有效。事实并非如此。所以你需要第二种方法,即建立一个新的ArrayList<>List<>的元素

5

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

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

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

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

10

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

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

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

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

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

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

更多结果

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

UnsupportedOperationException异常

2

可以演员名单<>到ArrayList的<>如果你知道你在做什么。 Java编译器不会阻止它。

但是:

  1. 这是不好的做法,而不检查铸造父类到子类(或接口实现类型)。 这更好的办法:

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

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

    就试试这个:

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