java - 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(); } }
解决方案
你应该可以这样做:
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 个extend
类Packet
:
DummyPacket
OtherPacket
LastPacket
但只有 2 个类实现了该Handleable
接口:
DummyPacket
OtherPacket
这意味着你可以检查一个类是否有这样的handle
方法:
public void callHandle(Handeable someClass) {
someClass.handle();
}
现在,我们可以过滤掉所有没有该handle
方法的类。
推荐阅读
- firebase - Flutter Drawer Photo 无法正常工作-'package:flutter/src/painting/_network_image_io.dart':断言失败:第 25 行 pos 14:'url != null':不正确
- postgresql - TimescaleDB 连续聚合视图的累积和
- java - 如果该行包含java中的某些数据,如何从csv文件中删除一行
- go - AWS API Gateway HTTP API 如何传递字符串查询参数?
- python - 为什么这个标签在锚定时会离开屏幕?
- javascript - 当我单击导航栏中的任何项目时,如何激活导航栏中的链接?
- bash - 以编程方式在 GCP VM 实例上运行 bash 脚本
- c++ - 用文字定义的静态 constexpr 函数
- php - 一旦下载的文件损坏,在 PHP 上创建 ZipArchive 文件的代码不起作用
- javascript - Mongo db更新数组中的对象,只更新第一个对象