对于我的项目,我需要一个可以容纳多种不同对象类型的2D数组。 java的问题在于它不允许你这样做。您只能拥有特定对象类型的数组。
现在不要误解我,但我做了一些研究,一个提出的解决方案是使用Object
数组,因为java中的每个类都默认扩展了对象类。例如:
Object[][] someArray = new Object[5][5];
someArray[1][2] = new Cat();
someArray[3][4] = new Dog();
这个问题是作为超类的对象类无法访问扩展它的子类的方法和字段。因此,如果我的cat或dog类中有公共eat()
方法,则someArray
中的元素将无法访问该方法。
所以我在这里死路一条。任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:1)
[请不要因为回答我自己的问题而判断我]
一种可能的解决方案是使用2D ArrayLists。 2D数组的工作方式是字面上有一维数组由一维数组组成。
也许相同的概念可以应用于ArrayLists,它实际上可以存储任何对象类型而不会出现可访问性问题。可以按如下方式创建5x5 ArrayList:
get_v(int&):
mov DWORD PTR [rdi], 2
mov eax, 2
ret
并将第1行第2行设置为cat对象:
ArrayList<ArrayList> someArray = new ArrayList<ArrayList>();
for(int x=0 ; x<5 ; x++)
{
someArray.add(new ArrayList());
for(int y=0 ; y<5 ; y++)
someArray.get(x).add(null);
}
所以2D ArrayLists虽然有点令人困惑,但可以非常有效地解决这个问题。
答案 1 :(得分:1)
调用eat()
类和`Cat``类的Dog
方法,可以将数组引用强制转换为子类引用。((Dog)someArray [x] [y]) 。吃();
public class Dog{
public Dog(){
super();
}
public String eat(){
String str = "yum";
return str;
}
public static void main (String[]args){
Object [][] arr = new Object [2] [2];
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
arr[i][j] = new Dog();
}
}
System.out.println(((Dog)arr[1][1]).eat());
}
}
答案 2 :(得分:0)
在您的情况下,理想的用途是创建一个名为Animal的超类,由狗和猫扩展。您的ArrayList或数组将是Animal类型。
答案 3 :(得分:-1)
这些物品需要有何不同?如果他们是你自己的类,那么只需创建一些他们都扩展的超类,并将其用作数组类型。如果你不想这样做,我想你可以这样设置:
private Object[][] array = new Object[5][5];
public void setValue(int x, int y, Object val) {
if(x > 0 && x < array.length && y > 0 && y < array[0].length) {
array[x][y] = val;
}
}
public Object getValue(int x, int y) {
if(x > 0 && x < array.length && y > 0 && y < array[0].length) {
return array[x][y];
}
return null;
}
使用它会有点单调乏味,但您可以将每次调用getValue()
转换为您需要的类型。使用面向对象编程,有一个简单的解决方案可能有点困难。我可以编写一些更高级的代码来返回转换为某个类的对象,但这只是一点点工作。如果您愿意,请告诉我。