对不起伙计们......不要与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;
}
}
答案 0 :(得分:1)
weapon
是Object
;因此,我们可以将数组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本身,所以一个对象数组无法升级到整数数组。如果你从一个整数数组下载到一个对象数组(如上例所示),然后再从一个对象数组再次升级到一个整数数组(因为我们从未删除它的基础类是一个整数数组)。