我正在处理从名为Creature的类继承的多个类。我有一个Creature对象数组,我正在循环,以确定数组中的哪些是子类Animal。我试过instanceOf
,但我收到一个错误,说我将其声明为变量。这是我的方法的样子:
public void notifyStateChange() {
for (int i = 0; i < count; i++) {
Class c = creatures[i].getClass();
if (c.getName().equals("Animal")) {
System.out.println("Animal type here");
}
}
}
答案 0 :(得分:2)
您不必检索数组中对象的运行时类,以确定对象是否为Animal
类型。只需以正确的方式使用instanceof
:
public void notifyStateChange() {
for (int i = 0; i < count; i++) {
if (creatures[i] instanceof Animal) {
System.out.println("Animal type here");
}
}
}
或者,您可以试试以下内容。它接近你正在尝试的。只需使用getSimpleName
代替getName
public void notifyStateChange() {
for (int i = 0; i < count; i++) {
Class c = creatures[i].getClass();
if (c.getSimpleName().equals("Animal")) {
System.out.println("Animal type here");
}
}
}
答案 1 :(得分:1)
我认为最好的方法是将动作放入Animal
类本身,或者使用包装器以防万一。我给你的想法,因为有很多方法可以实现它。
您的代码应如下所示:
public void notifyStateChange() {
for (int i = 0; i < count; i++) {
creatures[i].doSmth();
}
}
另外,您可以将所有doSmth()
放入Enum
或Map
,然后在代码中选择正确的实例。 if..else
的主要问题是,如果您添加Creature
的新子项,则必须修改所有这些位置。