无法将对象数组转换为另一个类型数组

时间:2011-06-04 03:39:01

标签: java

当我尝试将一个对象类型转换为另一个对象类型时,我得到一个ClassCastException时,我已经拉了我的头发....我确信这个代码可以工作,因为所有对象都是Object类的子类...但不知怎的,我得到了这个例外...一些帮助人?

对不起伙计们......不要与Original ArrayList混淆,我正在学习Java编程,并且正在练习构建对象数组......例外是在第8行,我将对象数组转换为武器数组类型...抱歉任何形式的拖钓......

public class ArrayList {
    public static void main(String args[]){
        ArrayList arrayList = new ArrayList();
        weapon[] weapons = new weapon[5];
        for (int i = 0; i < weapons.length; i++) {
            weapons[i] = new weapon(i);
        }
        weapons = (weapon[]) arrayList.add(weapons, 
                new weapon(weapons.length + 1, "mp5"));
    }

    public Object[] add(Object[] targetObjectList, Object add){
        Object[] oldList = new Object[targetObjectList.length];
        for (int i = 0 ; i < oldList.length; i++){
            oldList[i] = targetObjectList[i];
        }
        Object[] newList = new Object[oldList.length+1];

        for (int i = 0; i < oldList.length; i++) {
            newList[i] = oldList[i];
        }
        newList[newList.length - 1] = add;
        return newList;
    }

}//end arrayList class

class weapon {
    String name;
    int id;
    public weapon(int id) {
        this.id = id;
        name = "weapon";
    }

    public weapon(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

4 个答案:

答案 0 :(得分:1)

weaponObject;因此,我们可以将数组af weapon视为Object的数组。但是,并非所有Object都是weapon s;因此,Object的数组可能不会被视为weapon的数组 - 除非似乎是Object数组的东西确实是weapon的数组首先。因此,您的方法将变得困难。你可以试试

weapon[] newList = new weapon[oldList.length+1];

相反,但是你需要将所有数组更改为weapon[]类型,并且该方法不会变为通用(我认为这是你的目标)。但是,如果您想要一个可以向任何类型的数组添加元素的方法,则应该使用泛型

P.S。如果您正在学习编程和数组,那么编写这样的add()方法是一个很好的练习 - 但如果您“只是希望它能够工作”,那么您应该使用ArrayList来完成整个工作。为你添加。

答案 1 :(得分:0)

数组是Object的子类。您无法将Object[]投射到weapon[]。以下是您的问题的通用解决方案:

weapons = (weapon[])arrayList.add(weapons, new weapon(weapons.length + 1, "mp5"),weapon.class);

public <T> T[] add(T[] targetObjectList, T add, Class<T> c) {
    T[] oldList = (T[])Array.newInstance(c, targetObjectList.length);
    for (int i = 0; i < oldList.length; i++) {
        oldList[i] = targetObjectList[i];
    }
    T[] newList = (T[])Array.newInstance(c, oldList.length + 1);

    for (int i = 0; i < oldList.length; i++) {
        newList[i] = oldList[i];
    }

    newList[newList.length - 1] = add;

    return newList;

}

注意:关注Java Naming Conventions。避免使用Java API类名作为您的班级名称。

答案 2 :(得分:0)

  • Object o = new Foo()。还行吧。 Foo是Object。作为Foo extends Object
  • Foo f = new Object()不行,对象不是Foo(编译器错误)
  • Foo f = (Foo)(new Object()) - ClassCastException

答案 3 :(得分:0)

您要做的事情被称为contravariance。您的代码中的固有问题是您在add函数中创建的ARRAY是一个对象数组(无论这些对象实际上最终是什么)。

如果您要执行以下操作,您的代码将起作用。我认为你需要在这个意义上使用泛型(看看实际的ArrayList类,因为它已经实现了这个)。

...snip...
    Object[] newList = new weapon[oldList.length+1];

    for (int i = 0; i < oldList.length; i++) {
        newList[i] = oldList[i];
    }
    newList[newList.length - 1] = add;
    return newList;
...snip...

这是一个示例代码,可以像您预期的那样工作。

public class Test {

    public static void main(String[] args) {
        Integer[] i = (Integer[])Test.get();

    }

    public static Object[] get() {
        Object[] o = new Object[20];
        for(int i = 0; i < o.length; i++) {
            o[i] = new Integer(0);
        }
        return o;
        }
}

ArrayList有一个方法.toArray(T [] a),它将返回一个包含新元素的放大数组大小。那么这种逆转如何发挥作用呢?通过java.reflect包。这是它实际工作原理的一个非常小的摘录(有一些不同的软件包可以协同工作来实现这一点。)

...Object[] function(Object[] typearray) {
    Object[] o = (Object[]) Array.newInstance(typearray.getClass().getComponentType(), 20);
    ...fill...
    return o;
}

你必须这样做的原因是因为ARRAY(因为Java中的所有内容都是对象)是一个Object本身,所以一个对象数组无法升级到整数数组。如果你从一个整数数组下载到一个对象数组(如上例所示),然后再从一个对象数组再次升级到一个整数数组(因为我们从未删除它的基础类是一个整数数组)。