注意:这是我的问题的抽象版本,因为许多实际代码可能会令人困惑并且与问题无关。
我有一个对象数组/ArrayList,它们都从另一个类继承其信息。
例如
class A
class B extends A
class C extends A
class D extends A
B、C 和 D 类的对象都放入 A 类型的数组中。
现在,当它们出来时,我想将它们转换回原始类型以使用特定的方法/变量等。我怎样才能做到这一点,而不必经历一组if 语句来尝试找出它是什么类型的子类? 这使我的代码非常不灵活,因为每次添加新类时我都必须编写一组新的 if 语句扩展了类 A。有没有一种方法可以简单地返回对象所属类的确切名称?
最佳答案
如果你只想要一个对象的类名,你可以使用
a.getClass().getName(); // or .getSimpleName();
即使a
被声明为父类(super class)的类型,这也将起作用。假设您问题中的类结构:
A a = new B();
System.out.println(a.getClass().getSimpleName());
a = new C();
System.out.println(a.getClass().getSimpleName());
将打印:
B
C
编辑
您在评论中描述的用例可以通过多种方式处理。最灵活的可能是 multiple dispatch pattern (与 visitor pattern 相关):
定义接口(interface)
公共(public)接口(interface)SpriteActor { void actOn(A anASprite); void actOn(B aBSprite); //ETC。 }
在
A
中定义一个方法:公共(public)A类{ 公共(public)无效acceptActor(SpriteActor Actor ){ actor.actOn(this); } }
在每个 Sprite 子类中重写此方法。奇怪的是,您可以在每个覆盖中使用完全相同的代码。这是必要的,以便编译器将调用绑定(bind)到
SpriteActor
实现的正确重载actOn
方法。在您的客户端代码中,实现
SpriteActor
接口(interface)。在每个重载的actOn
方法中实现特定于类型的调用。
关于java - 不使用 if 语句从数组中获取 instanceof 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386039/