多个不同对象的二维数组

时间:2017-06-14 03:55:46

标签: java arrays

对于我的项目,我需要一个可以容纳多种不同对象类型的2D数组。 java的问题在于它不允许你这样做。您只能拥有特定对象类型的数组。

现在不要误解我,但我做了一些研究,一个提出的解决方案是使用Object数组,因为java中的每个类都默认扩展了对象类。例如:

Object[][] someArray = new Object[5][5];
someArray[1][2] = new Cat();
someArray[3][4] = new Dog();

这个问题是作为超类的对象类无法访问扩展它的子类的方法和字段。因此,如果我的cat或dog类中有公共eat()方法,则someArray中的元素将无法访问该方法。

所以我在这里死路一条。任何帮助表示赞赏。提前谢谢。

4 个答案:

答案 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()转换为您需要的类型。使用面向对象编程,有一个简单的解决方案可能有点困难。我可以编写一些更高级的代码来返回转换为某个类的对象,但这只是一点点工作。如果您愿意,请告诉我。