【问题标题】:Java arraylist incompatible types errorJava arraylist 不兼容类型错误
【发布时间】:2013-10-29 07:04:33
【问题描述】:

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

这是我的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); 行用 incompatible types 消息指示。

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

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

我希望有人能够为我澄清我的错在哪里。如果有什么不同,我在 BlueJ 中做这些东西,这可能不是最好的工具,但它是我应该用于这个学校项目的工具。

【问题讨论】:

  • 只需要投return (Product)stock.get(index);

标签: java arraylist bluej incompatibletypeerror


【解决方案1】:
private ArrayList stock;

你应该用这样的有界类型重新声明它:

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

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

Product test = stock.get(index);

无法正常工作,因为您试图将原始 Object 分配给 Product

其他人建议将 Object 转换为 Product,但我不建议这样做。

【讨论】:

  • 感谢您的回答。我已经设法通过使用 Danstahr 的“ArrayList stock;”的建议解决了这个问题。这个对我来说似乎比你的建议简单一点,尽管我无法判断哪个更好。有区别吗?我仍然想知道为什么其他方法 printProductDetails() 在没有指定 ArrayList 的类型的情况下确实有效。
  • 哎哟。但无论如何,printProductDetails() 起作用了,因为您正在调用 toString(),这是为所有 java Objects 定义的。
  • @Stonelesscutter :我们的答案基本相同,而这个更具描述性。 printProductDetails() 工作得很好,因为 stock.get(index) 返回一个 Object 并且在 Object 上有一个名为 toString() 的方法,所以编译器看起来很好。在运行时对 Product 对象调用 toString() 方法,因为在 Java 中,所有方法都被视为虚拟方法。
  • 我完全可以选择您的两个回复作为我问题的答案,但不幸的是我只能选择一个。如果你们同意,我可以将其切换到这个答案。我想我开始明白了,但我仍然不明白为什么 toString() 方法与 getID() 方法不同,因为它们都定义在同一个类中。 Product 中的 toString() 方法不是取代了通用的 toString() 方法吗?
  • @Stonelesscutter:关于这个任务:Product test = stock.get(index); stock.get(index) 返回一个对象。对象不是产品,因此不能将其分配给产品类型的变量。您需要以某种方式告诉编译器 get() 方法的结果是一个产品。在我的回答中,我为您提供了两种方法。另外,toString() 方法有点特别。它已在 Object 类中定义,您只需在自定义类中覆盖它。
【解决方案2】:

您的stock 定义为private ArrayList stock,这意味着stock.get() 返回一个没有任何特殊类型的Object。您应该将 Stock 设为产品的 ArrayList

ArrayList<Product> stock;

或手动转换get 方法的结果

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

【讨论】:

  • 谢谢,我已经使用了你的第一个建议,另一个也可以,但是每次我想接近 ArrayList 中的对象时,我都必须指定类型。
【解决方案3】:
Product test = (Product) stock.get(index);

或者,如果您将列表设为List&lt;Product&gt; stock,您的线路应该无需更改即可工作。

【讨论】:

    猜你喜欢
    • 2012-10-19
    • 2013-09-23
    • 1970-01-01
    • 2018-03-11
    • 2016-09-11
    • 2011-08-26
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多