为什么我不能在我从HashMap获取的对象上使用其他类的公共方法?

aid*_*eno 1 java polymorphism inheritance hashmap map

我有一个名为的类Pizza,如下所示:

public class Pizza extends MenuItem
{ 
    private final String base;

    public String getBase()
    {
        return base;
    }
} 
Run Code Online (Sandbox Code Playgroud)

我的基类MenuItem有一个名为的方法addItem(),如下所示:

 public static void addItem(String menuItemNumber, MenuItem menuItem)
    {
        itemsMap.put(menuItemNumber, menuItem); //itemsMap is a class HashMap
        itemsSet = itemsMap.entrySet();
        System.out.println(itemsSet); //this prints the object's reference
        MenuItem pizza = (itemsMap.get("1"));
        System.out.println(pizza.getBase());//Problem is in this line
Run Code Online (Sandbox Code Playgroud)

为什么我不能pizza在这里用来调用getBase()

T.J*_*der 6

因为你已经将pizza变量声明为MenuItem,而不是Pizza.因此,您需要输入它的参考MenuItem,并且您只能使用这些MenuItem方法.既然getBase是由提供Pizza,不是MenuItem,你不能在不做更多事情的情况下使用它.

如果您更改此行:

MenuItem pizza = (itemsMap.get("1"));
Run Code Online (Sandbox Code Playgroud)

Pizza pizza = itemsMap.get("1");
Run Code Online (Sandbox Code Playgroud)

(那些最外面()没有做任何事情)然后你可以使用getBase.

如果itemsMap声明为Map<String, MenuItem>,你需要一个演员:

Pizza pizza = (Pizza)itemsMap.get("1");
Run Code Online (Sandbox Code Playgroud)

甚至是警卫:

MenuItem mi = itemsMap.get("1");
if (mi instanceof Pizza) {
    System.out.println(((Pizza)mi).getBase());
}
Run Code Online (Sandbox Code Playgroud)