【问题标题】:Java Object Array Foreach Method AccessJava 对象数组 Foreach 方法访问
【发布时间】:2012-02-27 01:31:14
【问题描述】:

在 PHP 开发了很长时间后,我决定踏入 Java。在 OOP 方法和所有这些方面很舒服,我试图从 java 中的那个点开始,但我对将我的 arraylist 对象传递到一个 for 语句以使用 Item 类方法打印回来感到困惑。

HelloInvetory.java

package helloInventory;

import java.util.Arrays;

public class HelloInventory {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Object InvetoryItems;

        Inventory inv = new Inventory();
        inv.createItemObj(101, "camera", "Used camera that I bought off of a homeless guy.", 500);
        InvetoryItems = inv.getAllInventoryItems();

        for(Object item : InvetoryItems){
               System.out.println(item.getItemName());
        }

        System.out.println("Done");
    }

}

Inventory.java

package helloInventory;

import java.util.*; 

/**
 * Tracks and maintains all items within the inventory
 * @author levi
 *
 */
public class Inventory {

    List<Object> InventoryItems = new ArrayList<Object>();

    /*
     * create object from Items class
     * and insert into Object[] array.
     */
    public void createItemObj(int sku, String name, String descriptor, float price) {
        Items item = new Items();
        item.setSku(sku);
        item.setItemName(name);
        item.setItemDescription(descriptor);
        item.setItemPrice(price);

        this.setInventoryItems(item);
    }
    public Object getAllInventoryItems() {
        //return InventoryItems;
         return this.InventoryItems.toArray();
    }

    public void setInventoryItems(Object inventoryItems) {
        //InventoryItems.add(inventoryItems);
         this.InventoryItems.add(inventoryItems);
    }
}

Items.java

package helloInventory;
/**
 * Class object to hold each item details
 * @author levi
 *
 */
public class Items {

    int sku;
    String itemName;
    String itemDescription;
    float itemPrice;

    public int getSku() {
        return sku;
    }
    public void setSku(int sku) {
        this.sku = sku;
    }
    public String getItemName() {
        return itemName;
    }
    public void setItemName(String itemName) {
        this.itemName = itemName;
    }
    public String getItemDescription() {
        return itemDescription;
    }
    public void setItemDescription(String itemDescription) {
        this.itemDescription = itemDescription;
    }
    public float getItemPrice() {
        return itemPrice;
    }
    public void setItemPrice(float itemPrice) {
        this.itemPrice = itemPrice;
    }

}

我被困在 HelloInventory.java 中

for(Object item : InvetoryItems){
               System.out.println(item.getItemName());
        }

IDE (Eclipse) 给我错误“只能迭代数组或 java.lang.Iterable 的实例”。我需要额外的东西,还是我在Java中完全错误地解决了这个问题?正确的例子会有所帮助。

最好, 列维

【问题讨论】:

    标签: java arrays object arraylist


    【解决方案1】:

    我的朋友,你这里的建筑很奇怪。您不应该在任何地方使用泛型 Objects,而是使用实际类型。第一件事:

    public Object getAllInventoryItems() {
        //return InventoryItems;
         return this.InventoryItems.toArray();
    }
    

    为什么不直接返回 List 本身?

    public List<Item> getAllInventoryItems() {
         return this.InventoryItems;
    }
    

    也改变这个:

    List<Item> InventoryItems = new ArrayList<Item>();
    

    还有这个:

    public void setInventoryItems(Item inventoryItems) {
         this.InventoryItems.add(inventoryItems);
    }
    

    现在迭代List 是一帆风顺的:

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Item> InvetoryItems;
    
        Inventory inv = new Inventory();
        inv.createItemObj(101, "camera", "Used camera that I bought off of a homeless guy.", 500);
        InvetoryItems = inv.getAllInventoryItems();
    
        for(Item item : InvetoryItems){
               System.out.println(item.getItemName());
        }
    
        System.out.println("Done");
    }
    

    顺便说一句,我出于习惯将Items 更改为Item。类名应该表示单个实体,因此按照惯例它是单数的。

    现在不要采取错误的方式,但您可能在 Java 上走错了路,所以我强烈推荐阅读以下内容:http://www.mindview.net/Books/TIJ/ 当我开始使用 Java 时,这对我有用,也许其他人可以也推荐一些好的来源。

    【讨论】:

      【解决方案2】:

      好的,有两件事。一是 Tudor 是绝对正确的,最好直接使用你期望的类,而不是 Objects,而且他的观点在风格上也很准确。

      第二个是,如果您真的必须使用对象列表,则需要从对象转换回您期望接收的任何类型。

      List<Object> list = inv.getAllInventoryItems();
      for (Object item : list){
          System.out.println((Items) item).getItemName();
      }
      

      但是,我不建议这样做,因为它会有效地处理应该是编译时错误并使其成为运行时错误(如果无法强制转换类)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多