【问题标题】:ArrayList is allowing me to store items to it but not call them using .get(), says it isn't an ArrayList [closed]ArrayList 允许我将项目存储到它但不使用 .get() 调用它们,说它不是 ArrayList [关闭]
【发布时间】:2020-04-07 23:09:33
【问题描述】:

我正在编写一个程序来使用命令设计模式来模拟餐厅菜单系统。我让 Menu 类中的构造函数初始化了一个数组列表。

import java.util.ArrayList;

public class Menu {

    public ArrayList<MenuItem> listOfMenuItems;

    public Menu() {
        listOfMenuItems = new ArrayList<MenuItem>();
    }

    public void addItemToMenu(String itemName, String itemDescription, double cost) {
        MenuItem newMenuItem = new MenuItem(itemName, itemDescription, cost);
        listOfMenuItems.add(newMenuItem);
    }

    public void displayMenu() {
        for(MenuItem item : listOfMenuItems) {
            System.out.println("NAME: " + item.getItemName() + ", DESCRIPTION: " + item.getItemDescription()
                + ", COST: " + item.getItemCost());
        }
    }
}

当在我的客户端调用一个新菜单时,它允许我存储项目(就像它是一个数组列表一样),它还允许我实现命令设计模式并将我的所有项目打印出来。但是,我添加了一个 Tab 类,它使用来自 Menu 对象的信息,但它不允许我使用 .get() 从我的数组列表中检索信息。

import java.util.*;

public class testClient {
    public static void main(String[] args) {

        Menu menu = new Menu();
        Tab tab;

        System.out.println("MENU:");

        menu.addItemToMenu("lobster", "#1234" , 25.99);
        menu.addItemToMenu("chicken", "#5687" , 20.99);
        menu.addItemToMenu("steak", "#4567" , 21.99);

        DisplayMenu dispMenu = new DisplayMenu(menu);
        SubmitButton onPressed = new SubmitButton(dispMenu);
        onPressed.submit();

        System.out.print("\n");

        System.out.println("ORDERS:");

        Order order = new Order();
        order.addNewOrder("#1234");
        order.addNewOrder("#5678");

        SubmitOrder submitOrder = new SubmitOrder(order);
        SubmitButton onSubmitPressed = new SubmitButton(submitOrder);
        onSubmitPressed.submit();

        tab.constructTab(newMenu.get(0).getItemName(), order.get(0).getOrderItemNumber(), newMenu.get(0).getItemCost());

    }
}

tab.constructTab(....) 行,返回如下错误:

testClient.java:31: error: cannot find symbol
        tab.constructTab(menu.get(0).getItemName(), order.get(0).getOrderItemNumber(), menu.get(0).getItemCost());
                             ^
  symbol:   method get(int)
  location: variable menu of type Menu
testClient.java:31: error: cannot find symbol
        tab.constructTab(menu.get(0).getItemName(), order.get(0).getOrderItemNumber(), menu.get(0).getItemCost());
                                                         ^
  symbol:   method get(int)
  location: variable order of type Order
testClient.java:31: error: cannot find symbol
        tab.constructTab(menu.get(0).getItemName(), order.get(0).getOrderItemNumber(), menu.get(0).getItemCost());
                                                                                           ^
  symbol:   method get(int)
  location: variable menu of type Menu
3 errors

当它应该是一个数组列表时,它说菜单是菜单类型?我不明白为什么它允许我添加项目。

如果您需要任何其他代码,请告诉我。

提前谢谢你!

【问题讨论】:

  • menu 没有 get() 方法,字段 menu. listOfMenuItems 有。 --- “它说菜单应该是数组列表时是菜单类型” 声明Menu menu = new Menu();menuMenu 类型,那么你为什么认为应该属于ArrayList 类型? --- 似乎您将menu(类型Menu)与字段listOfMenuItems(类型ArrayList&lt;MenuItem&gt;)混淆了。

标签: java object arraylist


【解决方案1】:

因为您的 Menu 类不是 ArrayList 并且它没有 get() 方法..

因此,你不能写newMenu.get(0),也许你想用newMenu.listOfMenuItems.get(0)替换它..

另外,我没有看到您在任何地方初始化 newMenu,也许它应该只是 menu,因为它正在初始化但未使用..

【讨论】:

  • 这是有道理的,我把 menu 和 listOfMenuItems 搞混了。它现在正在工作。谢谢!
【解决方案2】:

首先,您应该将listOfMenuItems 设置为私有,这样您就只能通过getter 和setter 访问它。这样您就可以防止其他类直接访问该字段,因为您可能希望在为其分配任何值之前添加进一步的控件和/或条件。 然后,您应该添加一个获取listMenuItem 的方法字段,就像使用addItemToMenu() 一样。 这段代码将如下所示:

import java.util.ArrayList;

    public class Menu {

        private ArrayList<MenuItem> listOfMenuItems;

        public ArrayList<MenuItem> getListOfMenuItems(){
              return this.listOfMenuItems;
        }
    }

要在你的主函数中调用它,你可以这样做,

public class testClient {
    public static void main(String[] args) {
        Menu menu = new Menu();
        Tab tab;
        tab.constructTab(menu.getListOfMenuItems().get(0).getItemName(), order.getListOfMenuItems().get(0).getOrderItemNumber(), menu.getListOfMenuItems().get(0).getItemCost());
        }
}

请注意,getListOfMenuItems() 的返回类型是 ArrayList,只有在调用 getListOfMenuItems() 后才能使用其所有预定义函数。

【讨论】:

  • 感谢您的建议,我也会将此添加到我的程序中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多