java - 如何用相关子类的多个实例填充 Java HashMap?

标签 java

我有一个名为“Canvas”的父类(super class),我从中创建了几个子类。我想将这些子类的实例存储在字典中。所以我尝试按如下方式设置我的代码:

public class Main {
    public static void main(String[] args) throws Exception{
        Canvas canvas = new Canvas();



        Menu menu = new Menu();
        Instructions instructions = new Instructions();
        Map<String, Canvas> screens = new HashMap<String, Canvas>();
        screens.put("menu", menu);
        screens.put("instructions", instructions);

因此,由于我要添加到字典中的内容都是我的 Canvas 类的子类,因此我设置了哈希表以接受该类型。这在大多数情况下都有效。然而,最大的问题是我无法访问任何子类的方法。我只能调用父类(super class)中存在的方法。

如果我尝试做类似的事情,

screens.get("menu").some_func_in_subclass();

编译器吐出“无法找到符号”消息。

所以,如果我有这样的东西:

SuperClass
  |
  |
  +------------------------------------   
        |               |             |
     SubClass1     SubClass2     SubClass3

如何将这些子类的实例存储在 HashMap 中?

最佳答案

这就是多态性的思想 - Canvas 的所有子类共享相同的方法(来自 Canvas 父类(super class)),但如果您向这些类添加方法,它们将不再共享。

一种方法是转换您的结果(假设您已经检查该值确实是 Menu ):

((Menu)screens.get("menu")).some_func_in_subclass();

但这违背了将所有内容保存在 Map<String, Canvas> 中的目的。首先。

最后,要么你需要Canvas对象,你不应该调用子类方法,或者你需要更具体的东西并且可能存在设计问题。

关于java - 如何用相关子类的多个实例填充 Java HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343447/

相关文章:

java - 使用 robots.keyPress() 后如何修复我的计算机按键配置?

java - 如何在不重复代码的情况下创建 JLabels(或其他元素)?

Java在源码中设置Kafka保留时间

正确分配内存后 Java 代码出错

java - 如何在端口后的 URL 中使用应用程序名称(就像我们在 tomcat 部署的应用程序中所做的那样)来调用 GWT 应用程序中的其余 Web 服务?

java - 将用户输入字符串与从文本文件读取的字符串进行比较

java - RecyclerView ItemTouchHelper.Callback : Dragging swap condition

java - Apache-poi:自动设置合并单元格的大小并使字体加粗

java - 设置图标时遇到问题

java - 如何获取 JConsole 中显示的 VM 信息?