Доступ к методу массива объектов Java - PullRequest
4 голосов
/ 05 февраля 2012

После долгого времени разработки на PHP я решил перейти на Java.Удобный в методологии ООП и все такое, я пытаюсь начать с этого момента в 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?Будет полезен правильный пример.

Best, Levi

Ответы [ 2 ]

7 голосов
/ 05 февраля 2012

У вас здесь очень странная архитектура, мой друг. Вы не должны использовать универсальные 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 голос
/ 05 февраля 2012

Хорошо, две вещи. Во-первых, Тюдор абсолютно прав, лучше использовать классы, которые вы ожидаете напрямую, а не объекты, и стилистически его очки тоже точны.

Во-вторых, если вам действительно нужно использовать список объектов, вам нужно будет выполнить приведение обратно от объекта к тому типу, который вы ожидаете получить.

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

Однако я бы не рекомендовал делать это, поскольку он эффективно принимает то, что должно быть ошибкой во время компиляции, и делает его ошибкой RunTime (если класс не может быть приведен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...