Java 多个不同对象的二维数组

Java 多个不同对象的二维数组,java,arrays,Java,Arrays,对于我的项目,我需要一个可以容纳多种不同对象类型的二维数组。java的问题是它不允许您这样做。只能具有特定对象类型的数组 现在请不要误解我的意思,但我做了一些研究,其中一个建议的解决方案是使用对象数组,因为java中的每个类都默认扩展对象类。例如: Object[][] someArray = new Object[5][5]; someArray[1][2] = new Cat(); someArray[3][4] = new Dog(); 问题在于,作为超类的对象类无法访问扩展它的子类的方

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

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

Object[][] someArray = new Object[5][5];
someArray[1][2] = new Cat();
someArray[3][4] = new Dog();
问题在于,作为超类的对象类无法访问扩展它的子类的方法和字段。因此,如果在我的cat或dog类中有一个public
eat()
方法,
someArray
中的元素将无法访问该方法


所以我在这里走到了死胡同。感谢您的帮助。提前感谢。

这些对象需要有多大的不同?如果它们是您自己的类,那么只需创建某种它们都扩展的超类,并将其用作数组类型。如果你不想这样做,我想你可以这样设置:

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;
}
private Object[][]数组=新对象[5][5];
公共无效设置值(整数x,整数y,对象值){
if(x>0&&x0&&y0&&x0&&y

使用它会有点乏味,但是您可以将对
getValue()
的每个调用转换为您需要的类型。对于面向对象编程,要找到一个简单的解决方案可能有点困难。我可以编写一些更高级的代码,将铸造的对象返回到某个类,但这需要做一点工作。如果您愿意,请告诉我。

[请不要因为回答我自己的问题而评判我]

一种可能的解决方案是使用2D ArrayList。二维阵列的工作方式是,从字面上说,由一维阵列组成的一维阵列

也许同样的概念也可以应用于ArrayList,ArrayList实际上可以存储任何对象类型,而不存在可访问性问题。可以按如下方式创建5x5 ArrayList:

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数组列表,虽然有点混乱,但可以非常有效地解决这个问题

要调用
Dog
类和'Cat``类的
eat()
方法,可以将数组引用转换为子类引用。((Dog)someArray[x][y]).eat()

公共级狗{
公犬(){
超级();
}
公共字符串eat(){
String str=“yum”;
返回str;
}
公共静态void main(字符串[]args){
Object[]arr=新对象[2][2];
对于(int i=0;i
在您的案例中,理想的用法是创建一个名为Animal的超类,该类由狗和猫扩展。您的ArrayList或array将是动物类型。

java中的所有内容都是对象!!!如果对象不是解决方案,则使用继承和接口…使用
instanceof
和强制转换来检查给定对象的类型,并相应地将其转换为该类型。为什么要用不同的对象填充二维数组?您将需要强制转换以获得它们的特定方法。也许除了抛出Object.ClassCastException外,您还应该寻找一个公共接口。您不能将超类对象强制转换为其子类。您没有被评判。事实上,如果你发现问题所在,我们鼓励你回答问题。我很高兴你明白了+1:)虽然使用
列表更好,但这并不能真正解决您的问题。
someArray.get(1).set(2, new Cat());
someArray.get(3).set(4, new Dog());
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());
    }
}