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

Zac*_*ack 1 java

我有一个名为"Canvas"的超类,我从中创建了几个子类.我想将这些子类的实例存储在字典中.所以我尝试设置我的代码如下:

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);
Run Code Online (Sandbox Code Playgroud)

因此,我想要添加到字典中的东西都是我的Canvas类的子类,我设置哈希表来接受该类型.这在大多数情况下都有效.但是,最大的问题是我无法访问任何子类的方法.我只能调用超类中存在的方法.

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

screens.get("menu").some_func_in_subclass();
Run Code Online (Sandbox Code Playgroud)

编译器吐出"无法找到符号"消息.

所以,如果我有这样的事情:

SuperClass
  |
  |
  +------------------------------------   
        |               |             |
     SubClass1     SubClass2     SubClass3
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 5

这就是多态的想法 - 所有子类Canvas共享相同的方法(来自Canvas超类),但如果你向这些类添加方法,它们就不再共享了.

一种方法是投射你的结果(假设你已经检查过这个值真的是一个Menu):

((Menu)screens.get("menu")).some_func_in_subclass();
Run Code Online (Sandbox Code Playgroud)

但它首先打破了把所有东西都放在一边的目的Map<String, Canvas>.

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