2013-10-20 53 views
1

回想起來,這個問題的答案很可能會變得很明顯,但現在我發現自己相當困惑於此。我會先給一些代碼塊,然後提出問題。Java數組列表不兼容類型錯誤

這是我的類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++; 
    } 
} 

}

這裏是我的類產品,再次與一些方法省略。

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; 
} 

}

我的問題就在於,我在查找產品信息()方法得到一個編譯時錯誤。更具體地說,線Product test = stock.get(index);用消息不兼容的類型表示。

StockManager的構造函數創建一個名爲stock的新的ArrayList。從方法addProduct()明顯可見,該ArrayList包含Product類型的項目。 Product類有許多變量,其中之一稱爲id,類型爲integer。該類還包含返回ID的方法getID()

據我所知,從arraylist獲取項目的方法是get()方法與()之間的數字指示項目的位置。鑑於我的數組列表包含Product的實例,因此我期望得到Product,因爲我在數組列表上使用get()方法。所以我不明白爲什麼當我定義一個名爲test類型爲Product的變量並嘗試從ArrayList中分配一個項目時它不起作用。據我所知,我在方法printProductDetails()中成功使用了相同的技術,其中我使用Product上的toString()方法對來自arraylist的對象進行操作。

我希望有人能爲我澄清我的過錯。如果它有什麼不同,我在BlueJ中做這個東西可能不是最好的工具,但它是我應該用於這個學校項目的東西。

+0

只需要投'回報(產品)stock.get(指數)的結果;' – nashuald

回答

4

您的stock被定義爲private ArrayList stock,這意味着stock.get()返回一個沒有任何特殊類型的對象。您應該使股票的產品

ArrayList<Product> stock; 

一個ArrayList或者投的方法get手動

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

謝謝你,我已經使用了你的第一個建議,另一個也可以工作,但是每次我想要接近ArrayList中的對象時都必須指定類型。 – Rainier

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

或如果你讓你的名單List<Product> stock你的生產線應該沒有變化地工作。如果你不這樣做

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

,這條線:

5
private ArrayList stock; 

你應該有限制類型,像這樣重新聲明此

Product test = stock.get(index); 
因爲你想

將無法​​正常工作將原始Object分配給Product

其他人建議將Object轉換爲Product,但我不會推薦這個。

+0

謝謝你爲你的答案。我已經設法通過使用Danstahr的「ArrayList 股票」的建議來解決問題;這個對我來說似乎比你的建議簡單一些,雖然我無法判斷哪一個會更好。有區別嗎?我仍然想知道爲什麼其他方法printProductDetails()確實沒有指定ArrayList的類型。 – Rainier

+0

哎。 但無論如何,'printProductDetails()'工作,因爲你正在調用'toString()',它是爲所有java'對象定義的。 – yamafontes

+0

@Stonelesscutter:我們的答案基本上是一樣的,而這個更具描述性。 '''printProductDetails()'''工作得很好,因爲''stock.get(index)''返回一個Object,並且在Object上有一個叫做toString()的方法,所以編譯器看起來很好。 toString()方法在運行時的Product對象上調用,因爲在Java中,所有方法都被視爲虛擬。 – Danstahr