Java中HashMap存储多类实例时如何根据类类型调用对应方法
实现方案
方案1:Java 16+ 模式匹配(代码最简洁)
Java 16及以上版本支持instanceof模式匹配,判断类型后会自动生成对应类型的变量,无需手动强转:
// 先取出对象,提前判空避免空指针 Object obj = ItemsData.get(5); if (obj == null) { // 处理键不存在的逻辑 return; } if (obj instanceof ClassOne one) { one.bark(); } else if (obj instanceof ClassTwo two) { two.jump(); } else if (obj instanceof ClassThree three) { three.fire(); }
方案2:低版本Java兼容实现
如果使用Java 15及以下版本,手动加类型强转即可:
Object obj = ItemsData.get(5); if (obj == null) { return; } if (obj instanceof ClassOne) { ((ClassOne) obj).bark(); } else if (obj instanceof ClassTwo) { ((ClassTwo) obj).jump(); } else if (obj instanceof ClassThree) { ((ClassThree) obj).fire(); }
方案3:多态优化设计(长期维护更推荐)
如果允许修改三个类的定义,可以通过公共接口抽象行为,避免到处写类型判断逻辑:
- 先定义公共行为接口
public interface ItemAction { void run(); }
- 三个类分别实现接口
public class ClassOne implements ItemAction { @Override public void run() { bark(); } // 原有bark方法保留 public void bark() { // 原有逻辑 } } public class ClassTwo implements ItemAction { @Override public void run() { jump(); } public void jump() { // 原有逻辑 } } public class ClassThree implements ItemAction { @Override public void run() { fire(); } public void fire() { // 原有逻辑 } }
- 调整HashMap泛型,直接存接口类型
HashMap<Integer, ItemAction> ItemsData = new HashMap<>();
调用时无需判断类型,直接执行统一方法即可:
ItemAction item = ItemsData.get(5); if (item != null) { item.run(); // 自动执行对应类的bark/jump/fire方法 }
内容的提问来源于stack exchange,提问作者Hronic
相关产品推荐
相关产品推荐

