我有一个名为“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/