将无类型的Arraylist转换为类型化的Arraylist

时间:2009-07-07 10:13:18

标签: java arraylist

将“Arraylist”转换为“Arraylist<Type>”是否有更优雅的解决方案?

当前代码:

ArrayList productsArrayList=getProductsList();
ArrayList<ProductListBean> productList = new ArrayList<ProductListBean>();

for (Object item : productsArrayList)
{
  ProductListBean product = (ProductListBean)item;
  productList.add(product);
}

3 个答案:

答案 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添加不同类型的东西。