Java重写抽象类onEvent方法如何避免强制转换IMissionEvent参数
解决方案
方案1:为抽象父类添加泛型限定(最推荐,编译期类型安全)
你遇到的报错本质是Java方法重写要求参数类型完全一致,不支持参数协变,通过泛型可以在定义子类时指定具体的入参事件类型,无需强制转换:
- 改造
Mission抽象类,添加泛型参数限定为IMissionEvent的实现类:
public abstract class Mission<T extends IMissionEvent> { public abstract void onEvent(final T event); }
MissionKill继承父类时指定具体泛型类型为MissionEventLogin,重写方法直接用对应类型入参:
public class MissionKill extends Mission<MissionEventLogin> { @Override public void onEvent(final MissionEventLogin event) { // 直接编写业务代码,无需强制类型转换 } }
该方案的优势是编译期就会校验事件类型和Mission子类的匹配关系,不会出现运行时类型转换异常。如果有其他Mission子类需要处理不同的事件类型,只需要继承时指定对应的泛型参数即可。
方案2:使用instanceof模式匹配(无需修改父类,适合JDK16+版本)
如果你无法修改父类Mission的定义,且使用的是JDK16及以上版本,可以用Java的instanceof模式匹配语法省略手动强转步骤:
@Override public void onEvent(final IMissionEvent event) { if (event instanceof MissionEventLogin login) { // 直接使用匹配得到的login变量,不需要手动强转 // 业务代码 } }
内容的提问来源于stack exchange,提问作者Girls are beautiful
相关产品推荐
相关产品推荐

