Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将对象设置为未知的类类型_Java_Arrays_Class - Fatal编程技术网

在Java中将对象设置为未知的类类型

在Java中将对象设置为未知的类类型,java,arrays,class,Java,Arrays,Class,对不起,我是一个刚开始使用Java的初学者,我遇到了这个问题 我有两门课,比如说 class Dog { } class Cat { } 然后我创建了一个数组,用这两个数组中的任何一个填充 Object[][] myAnimal = new Object[4][5]; 我想将一个变量设置为数组中的一个随机对象,但我不知道它来自哪个类。有没有办法做到这一点 好吧,假设数组中充满了这两个类中的一个类的实例,您可以执行以下操作: if(myAnimal[x][x] instanceof Do

对不起,我是一个刚开始使用Java的初学者,我遇到了这个问题

我有两门课,比如说

class Dog {

}

class Cat {

}
然后我创建了一个数组,用这两个数组中的任何一个填充

Object[][] myAnimal = new Object[4][5];

我想将一个变量设置为数组中的一个随机对象,但我不知道它来自哪个类。有没有办法做到这一点

好吧,假设数组中充满了这两个类中的一个类的实例,您可以执行以下操作:

if(myAnimal[x][x] instanceof Dog) //it is an instance of the Dog class 

你真的不应该这样做,尤其是作为一个初学者。你说你想随机挑选一只狗或猫?更好的方法是保留两个单独的阵列,一个用于狗,一个用于猫。然后你可以从两个数组中选择一个随机元素,你就知道你在处理什么类了。

我认为你必须使用反射api,如果你想要那个类实例,在运行时检查任何对象都是必要的。。。我想你的问题是你不想把条件静态化,也不想把不同动物的条件动态化,今天是狗,明天是老虎,明天是牛等等。。。因此,请使用refelction api理想的解决方案是创建您自己的超类,比如说
Animal
,它声明了抽象方法。例如,您可以执行以下操作:

abstract class Animal {
    public abstract void speak();
}
然后,
Cat
Dog
分别为抽象方法提供各自的实现:

class Cat {
    public void speak() {
        System.out.println("Meow!");
    }
}

class Dog {
    public void speak() {
        System.out.println("Woof!");
    }
}
现在您只需将数组声明为

Animal[][] myAnimal = new Animal[4][5];
在阵列中放置一些动物:

myAnimal[0][0] = new Dog();
myAnimal[0][1] = new Cat();
然后告诉动物们说:

myAnimal[0][0].speak();
myAnimal[0][1].speak();

我在这里省略了
main()
的语法,但我希望您可以自己将其组合起来。这里使用的概念称为“多态性”。我强烈建议您研究它,以帮助您在设计代码时使用这个重要的面向对象概念。

< P>访问者模式将是在这种情况下考虑的真正好的方法。比如说,你正在制作一个游戏,需要对不同的对象(猫、狗、钱等)做出不同的反应。这样做:

创建一个具有以下定义的接口
IAnimal

interface IAnimal {
    void visit(IAnimalVisitor visitor, Object param);
}

class Cat implements IAnimal {
    void visit(IAnimalVisitor visitor, Object param) {
        visitor.visit(this, param);
    }
}

class Dog implements  IAnimal {
    void visit(IAnimalVisitor visitor, Object param) {
        visitor.visit(this, param);
    }
}
对于定义的每种动物类型,
IAnimalVisitor
将包含一个
visit()
方法。所以它会像:

interface IAnimalVisitor {
    public void visit(Cat c, Object param);
    public void visit(Dog c, Object param);
}
然后,你可以用你的逻辑来处理猫和狗根据你想要的。例如:

class AnimalFeeder implements IAnimalVisitor {
    public void visit(Cat c, Object param) {
        c.feed(milk);
        c.feed(cat_food);
    }
    public void visit(Dog d, Object param) {
        d.feed(dog_food);
    }
}
然后您可以使用上面的food feed类向您馈送
IAnimal
数组,如下所示:

IAnimal[] animals = new IAnimal[] { new Cat(), new Dog(), 
    new Dog(), new Cat() };

IAnimalVisitor feeder = new AnimalFeeder();
for(IAnimal animal : animals) {
    animal.visit(feeder, null); 
}

您可以完全自由地处理类中的任何层次结构。只需将每个动物类类型的
visit()
放在
IAnimalVisitor

中,您就可以在运行时检查对象的类(
obj.getClass()
),但这并不一定能让您免于糟糕的设计。你想完成什么?如果(猫的myAnimalObj实例)或者如果(猫的myAnimalObj实例)我想模拟一个游戏,你要么有一只猫,要么有一只狗,这取决于应该发生什么不同的事情。我在数组中循环,试图设置一个等于当前单元格的变量,然后使用if语句检查它是dog还是cat。jayamohan,如何将对象设置为我不知道的类类型?这就是我遇到的问题。好吧,如果我做你给出的例子,我可以把一个新对象设置为当前对象吗。像Dog myDog=myAnimal[x][x]?将它们放在两个单独的数组中的好处是,您可以创建一个Dog类数组和一个Cat类数组。因此,当您这样做时,您不必创建新对象。你可以说,我随机挑选的动物是混乱的[5]。可以使用数组中的该元素在目录中工作。e、 g.catArray[5].someCatFunction()我应该说数组解决方案会起作用,但您真正需要的可能是创建一个类动物,就像代码大师所说的那样。这样,您就可以拥有一个动物数组,可能是猫或狗。在不创建单独的类的情况下,我可以只调用您列出的方法。例如,if(instanceof dog){myAnimal[0][0]。speak()}@BillyThompson
instanceof
是一个二进制运算符。这意味着它需要两个参数,例如
if(myAnimal[0][0]Dog实例){myAnimal[0][0].speak();}
。是的,如果
Animal
有一个具体的
speak()
方法,您可以这样做。然而,无论动物是狗还是猫,它都会做同样的事情。我在回答中给出的建议说明了多态性的概念。一个优点是您不需要使用您建议的
if
语句。您还可以轻松添加更多的动物,如
,等等,但代码要少得多。