首页 > 解决方案 > Java instanceof 软编码的东西?

问题描述

我有一个名为PacketType. 然后我有一个名为Packet的类和DummyPacket扩展的类Packet

public class Packet {
}

public class DummyPacket extends Packet {
    public void handle() {
    }
}

我想要某种处理程序,这样当我得到一些对象包时,我想handle()从 -DummyPacket` 调用该方法。有什么方法可以做这个软编码,还是我必须 Packet instanceof DummyPacket 为每个扩展 Packet 的类做?

我尝试使用Class<?>.isInstance(),但这对我没有帮助,因为我无法Class<?>调用该方法:

我有点想这样称呼它:

公共静态无效句柄(数据包数据包){ if (packet.getType().clazz.isInstance(packet)) { packet.getType().clazz.handle(); } }

标签: javainstanceof

解决方案


你应该可以这样做:

public void callHandle(Packet packet) {
  if (packet instanceof DummyPacket) {
    ((DummyPacket) packet).handle();
  }
}

[编辑] 在 OP 提供更多信息后,事实证明他正在寻找一种方法让多个类具有具有相同签名的方法。

您正在寻找的是接口。看看这些类:

public class Packet { }
public interface Handleable {
  public void handle();
}

public class DummyPacket extends Packet implements Handleable {
  @Override
  public void handle() {
    // Do something
  }
}

public class OtherPacket extends Packet implements Handleable {
  @Override
  public void handle() {
    // Do something else
  }
}

public class LastPacket extends Packet { }

在这个例子中,你有 3 个extendPacket

  • DummyPacket
  • OtherPacket
  • LastPacket

但只有 2 个类实现了该Handleable接口:

  • DummyPacket
  • OtherPacket

这意味着你可以检查一个类是否有这样的handle方法:

public void callHandle(Handeable someClass) {
  someClass.handle();
}

现在,我们可以过滤掉所有没有该handle方法的类。

我建议您阅读有关继承抽象类接口的更多信息。


推荐阅读