Почему я не могу использовать открытые методы из других классов для объекта, который я получил из HashMap?

1

У меня есть класс под названием Pizza который выглядит так:

public class Pizza extends MenuItem
{ 
    private final String base;

    public String getBase()
    {
        return base;
    }
} 

Мой базовый класс 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 reference
        MenuItem pizza = (itemsMap.get("1"));
        System.out.println(pizza.getBase());//Problem is in this line

Почему я не могу использовать pizza для вызова getBase()?

  • 1
    Примечание: самый внешний () в MenuItem pizza = (itemsMap.get("1")); не имеют никакой функции вообще. Это точно так же, как MenuItem pizza = itemsMap.get("1");
  • 0
    @T.J.CrowderЯ знал это, и они не в моем реальном коде. Вставьте их по какой-то причине, когда я скопировал здесь. В любом случае, спасибо за хедз-ап.
Теги:
polymorphism
inheritance
hashmap
map

1 ответ

6
Лучший ответ

Потому что вы pizza переменную pizza как MenuItem, а не Pizza. Таким образом, ссылка, которую вы имеете на это, набирается MenuItem, и вы можете использовать только методы MenuItem. Поскольку getBase предоставляется Pizza, а не MenuItem, вы не можете использовать его, не делая ничего более.

Если вы измените эту строку:

MenuItem pizza = (itemsMap.get("1"));

в

Pizza pizza = itemsMap.get("1");

(эти outermost () ничего не делали), то вы можете использовать getBase.

Если itemsMap объявлен как Map<String, MenuItem>, вам понадобится бросок:

Pizza pizza = (Pizza)itemsMap.get("1");

или даже охранник:

MenuItem mi = itemsMap.get("1");
if (mi instanceof Pizza) {
    System.out.println(((Pizza)mi).getBase());
}
  • 1
    Я попытался изменить MenuItem Pizza на Pizza Pizza , но не понял, что мне понадобится этот состав из-за объявления карты. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню