将“Arraylist
”转换为“Arraylist<Type>
”是否有更优雅的解决方案?
当前代码:
ArrayList productsArrayList=getProductsList();
ArrayList<ProductListBean> productList = new ArrayList<ProductListBean>();
for (Object item : productsArrayList)
{
ProductListBean product = (ProductListBean)item;
productList.add(product);
}
答案 0 :(得分:10)
ArrayList<ProductListBean> productList = (ArrayList<ProductListBean>)getProductsList();
请注意,这本质上是不安全的,因此只有在无法更新getProductsList时才应使用它。
答案 1 :(得分:4)
查找关于Java的类型擦除。
将集合键入包含ProductListBean
的集合是编译时注释,编译器可以使用它来确定您是否做了正确的事情(即添加Fruit
类将不是有效的。)
然而,一旦编译,该集合只是ArrayList
,因为类型信息已被删除。因此,ArrayList<ProductListBean>
和ArrayList
是相同的东西,并且施法(如马修的答案)将起作用。
答案 2 :(得分:1)
你描述的方式是类型安全的(不是真的,但是如果你弄错的话它会抛出一个ClassCastException),但可能是最慢和最冗长的方式(虽然它很清楚)。简单地转换ArrayList的示例是最快的,但是正如海报指出的那样不是类型安全的,当然你可能想要将它复制到另一个列表中。如果您已经准备好放弃将其复制到ArrayList并且对List很满意(您应该这样做),那么只需执行以下操作:
List<ProductListBean> productList =
Arrays.asList(((List<ProductListBean>)getProductsList()).toArray(new ProductListBean[] {}));
它很快,因为底层复制是使用System.arraycopy完成的,它是一个本机方法,并且它是类型安全的(同样不是真的,但它和你的例子一样安全),因为如果你试图将System.arraycopy抛出一个ArrayStoreException添加不同类型的东西。