4

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

当前代码:

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

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

3 回答 3

10
ArrayList<ProductListBean> productList = (ArrayList<ProductListBean>)getProductsList();

请注意,这本质上是不安全的,因此只有在无法更新 getProductsList 时才应使用它。

于 2009-07-07T10:15:14.170 回答
4

查找关于 Java的类型擦除。

将集合键入为包含ProductListBean是集合上的编译时注释,编译器可以使用它来确定您是否在做正确的事情(即添加一个Fruit类将无效)。

然而,一旦编译该集合就只是一个,ArrayList因为类型信息已被删除。因此,ArrayList<ProductListBean>ArrayList是同一件事,并且铸造(如马修的答案)将起作用。

于 2009-07-07T10:20:18.530 回答
1

您描述的方式是类型安全的(不是真的,但如果您弄错了它会抛出 ClassCastException),但可能是最慢和最冗长的方式(尽管它很清楚)。给出的简单转换 ArrayList 的示例是最快的,但正如海报所指出的那样,它不是类型安全的,当然你可能还是想将它复制到另一个列表中。如果您准备放弃将其复制到 ArrayList 的需要并且对 List 感到满意(您应该这样做),只需执行以下操作:

List<ProductListBean> productList = 
        Arrays.asList(((List<ProductListBean>)getProductsList()).toArray(new ProductListBean[] {}));

它很快,因为底层复制是使用 System.arraycopy 完成的,这是一种本机方法,而且它是类型安全的(同样不是真的,但它和你的例子一样安全)因为如果你尝试添加一些东西,System.arraycopy 会抛出一个 ArrayStoreException不属于同一类型。

于 2009-07-07T11:46:34.220 回答