gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:19:02 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com