java - 不使用 if 语句从数组中获取 instanceof 类型

标签 java

注意:这是我的问题的抽象版本,因为许多实际代码可能会令人困惑并且与问题无关。

我有一个对象数组/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 相关):

  1. 定义接口(interface)

    公共(public)接口(interface)SpriteActor { void actOn(A anASprite); void actOn(B aBSprite); //ETC。 }

  2. A中定义一个方法:

    公共(public)A类{ 公共(public)无效acceptActor(SpriteActor Actor ){ actor.actOn(this); } }

  3. 在每个 Sprite 子类中重写此方法。奇怪的是,您可以在每个覆盖中使用完全相同的代码。这是必要的,以便编译器将调用绑定(bind)到 SpriteActor 实现的正确重载 actOn 方法。

  4. 在您的客户端代码中,实现 SpriteActor 接口(interface)。在每个重载的 actOn 方法中实现特定于类型的调用。

关于java - 不使用 if 语句从数组中获取 instanceof 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386039/

相关文章:

java - 使用 compositeKey 的 Hibernate 示例 OneToMany

命令行上的java相对路径与绝对路径

java - 如何获取 HttpClient 请求的响应代码

Java JOptionPane

java - Kotlin:向 guice 注入(inject)的依赖项添加一个接口(interface),以便我们可以仅出于单元测试目的而模拟它们?

Java 继承字段

java - 使用 LocalDate 类计算指定天数的日期差异

java - 从 jtextfield 获取数据并将其反转以显示在另一个 jtextfield 中

java - 使用Dao和Bean类通过MVC模型将数据插入数据库

java - 将每个资源的名称与 sqlite 数据库变量的内容进行比较