Java arraylist不兼容类型错误

时间:2013-10-20 22:12:40

标签: java arraylist bluej incompatibletypeerror

回想起来,回答这个问题的答案可能很明显,但现在我发现自己相当坚持这一点。我先给出一些代码块,然后再提出问题。

这是我的类Stockmanager的一部分,我省略了一些与此问题无关的方法。

import java.util.ArrayList;

public class StockManager
{
private ArrayList stock;

public StockManager()
{
    stock = new ArrayList();
}

public void addProduct(Product item)
{
    stock.add(item);
}

public Product findProduct(int id)
{
    int index = 0;
    while (index < stock.size())
    {
        Product test = stock.get(index);
        if (test.getID() == id)
        {
            return stock.get(index);
        }
        index++;
    }
    return null;
}

public void printProductDetails()
{
    int index = 0;
    while (index < stock.size())
    {
        System.out.println(stock.get(index).toString());
        index++;
    }
}

}

这是我的类Product,再次省略了一些方法。

public class Product
{
private int id;
private String name;
private int quantity;

public Product(int id, String name)
{
    this.id = id;
    this.name = name;
    quantity = 0;
}

public int getID()
{
    return id;
}

public String getName()
{
    return name;
}

public int getQuantity()
{
    return quantity;
}

public String toString()
{
    return id + ": " +
           name +
           " voorraad: " + quantity;
}

}

我的问题在于我在findProduct()方法中遇到编译时错误。更具体地说,行Product test = stock.get(index);会显示消息不兼容的类型

StockManager的构造函数创建一个名为stock的新ArrayList。从方法addProduct()可以明显看出,ArrayList包含Product类型的项目。 Product类有许多变量,其中一个变量名为id,类型为整数。该类还包含一个方法getID(),该方法返回 id

据我所知,从arraylist获取项目的方法是get()方法,其中()表示项目位置的数字。看到我的arraylist包含Product的实例,当我在arraylist上使用Product方法时,我希望得到get()。所以我不明白为什么当我定义一个名为Test的变量类型的变量并尝试将一个项目从arraylist分配给它时它为什么不起作用。据我所知,我在方法printProductDetails()中成功使用了相同的技术,我使用了来自产品的toString()方法,来自arraylist的对象。

我希望有人能够为我澄清我的错。如果它有任何区别,我在BlueJ做这个东西,这可能不是最好的工具,但它是我应该用于这个学校项目的那个。

3 个答案:

答案 0 :(得分:5)

private ArrayList stock;

您应该使用有界类型重新声明:

private List<Product> stock = new ArrayList<Product>();

如果你不这样做,这一行:

Product test = stock.get(index);

无效,因为您尝试将原始Object分配给Product

其他人建议将Object投射到Product,但我不建议这样做。

答案 1 :(得分:4)

您的stock定义为private ArrayList stock,这意味着stock.get()会返回没有任何特殊类型的对象。您应该使Stock成为产品的ArrayList

ArrayList<Product> stock;

或手动投射get方法的结果

Product test = (Product)stock.get(whatever);

答案 2 :(得分:1)

Product test = (Product) stock.get(index);

或者如果您列出了List<Product> stock,那么您的行应无需更改即可生效。