Java实例的软编码?

时间:2019-06-19 14:03:47

标签: java instanceof

我有一个名为PacketType的枚举。然后,我有一个名为Packet的类和一个扩展了DummyPacket的类Packet

public class Packet {
}

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

我想要某种处理程序,以便当我得到一些对象包时,我想从-DummyPacket`中调用handle()方法。是否可以通过某种方式对此进行软编码,或者我必须做 Packet instanceof DummyPacket 对于扩展Packet的每个类?

我尝试使用Class<?>.isInstance(),但这无济于事,因为我无法获取Class<?>来调用该方法:

我有点想这样称呼它:

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

1 个答案:

答案 0 :(得分:2)

您应该可以这样做:

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

[EDIT]在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 { }

在此示例中,您拥有extendPacket的3个类:

  • DummyPacket
  • OtherPacket
  • LastPacket

但是只有两个实现Handleable接口的类:

  • DummyPacket
  • OtherPacket

这意味着您可以检查类是否具有handle方法,如下所示:

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

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

我建议您阅读有关inheritanceabstract classesinterfaces的更多信息。