Java 复制另一个ArrayList的ArrayList时发生强制转换异常

Java 复制另一个ArrayList的ArrayList时发生强制转换异常,java,arraylist,casting,Java,Arraylist,Casting,所以我有一个产品的ArrayList,我在Category类的开头实例化了它 private ListInterface<Product> products; public Category(String categoryName) { products = new ArrayList<Product>(); } 私有列表接口产品; 公共类别(字符串类别名称){ products=新的ArrayList(); } 我想使

所以我有一个产品的ArrayList,我在Category类的开头实例化了它

    private ListInterface<Product> products;

    public Category(String categoryName) {
           products = new ArrayList<Product>();
    }
私有列表接口产品;
公共类别(字符串类别名称){
products=新的ArrayList();
}
我想使用以下方法返回特定类别的所有产品的深度副本

    public ListInterface<Product> getAllProducts() {
           ListInterface<Product> temp = new ArrayList<Product>();              
           for (Product prod : products.toArray()) // CAST EXCEPTION HERE
                temp.add(prod);
           return temp;
    } 
    public E[] toArray() {
    @SuppressWarnings("unchecked")
    E[] result = (E[])new Object[size];

    for (int index = 0; index < size; index++) {
        result[index] = list[index];
    }

    return result;
    }
公共列表接口getAllProducts(){ ListInterface temp=新的ArrayList(); for(Product prod:products.toArray())//此处强制转换异常 温度添加(产品); 返回温度; } 下面是toArray()方法

    public ListInterface<Product> getAllProducts() {
           ListInterface<Product> temp = new ArrayList<Product>();              
           for (Product prod : products.toArray()) // CAST EXCEPTION HERE
                temp.add(prod);
           return temp;
    } 
    public E[] toArray() {
    @SuppressWarnings("unchecked")
    E[] result = (E[])new Object[size];

    for (int index = 0; index < size; index++) {
        result[index] = list[index];
    }

    return result;
    }
public E[]toArray(){
@抑制警告(“未选中”)
E[]结果=(E[])新对象[大小];
对于(int index=0;index
运行程序时,我得到“线程中的异常”main“java.lang.ClassCastException:java.base/[Ljava.lang.O 无法将Object;强制转换为getAllProducts()方法的“for”循环中的[L…Product;”


我不明白为什么会出现这种异常,因为.toArray()应该返回一个产品[]。有没有更简单的方法来深度复制并返回此ArrayList?

嗯,
ArrayList
实现了
Cloneable
接口。因此,您可以做的一件好事是开始读取标准库的代码。我提取了此特定方法:

/**
*返回此ArrayList实例的浅层副本
*图元本身不会被复制。)
*
*@返回此ArrayList实例的克隆
*/
公共对象克隆(){
试一试{
ArrayList v=(ArrayList)super.clone();
v、 elementData=Arrays.copyOf(elementData,size);
v、 modCount=0;
返回v;
}捕获(CloneNotSupportedException e){
//这不应该发生,因为我们是可克隆的
抛出新的内部错误(e);
}
}

我建议你总是试着从中学习。我希望它能有所帮助。

什么是
列表界面
?问题的可能重复是行
E[]结果=(E[])新对象[size];
。你不能像这样投射数组,就像你不能做
(String[])新对象[]{“你好”,“世界”
。一个
对象[]
不是
产品[]
,即使数组中的对象都是
产品
实例,因此强制转换失败。@azurefrog是ADT列表的接口。@kaya3不幸的是,那行代码不是我的(那是我教授的代码)。有没有其他方法可以在没有toArray()的情况下复制ArrayList不太复杂的方法?