Java对象阵列Foreach方法访问

时间:2012-02-04 23:14:17

标签: java arrays object arraylist

在PHP开发很长一段时间后,我决定进入Java。在OOP方法中很舒服,所有这一切,我都试图在java中开始这一点,但是我正忙着将我的arraylist对象传递给for语句,使用Item类方法打印出来。 / p>

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中以错误的方式解决这个问题?正确的例子会有所帮助。

最佳, 列维

2 个答案:

答案 0 :(得分:7)

我的朋友,你有一个非常奇怪的建筑。您不应该在任何地方使用通用Object,而是使用实际类型。第一件事:

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时,这对我很有用,也许其他人也可以提出一些好的消息来源。

答案 1 :(得分:1)

好的,有两件事。一个是都铎是绝对正确的,最好是直接使用你期望的课程,而不是对象,风格上他的观点也是准确的。

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

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

但是,我不建议这样做,因为它有效地采取了应该是编译时错误并使其成为RunTime错误(如果该类无法转换)。