2017-10-13 142 views
0

我很新的Java和可能無法看到某事很明顯,但這裏是我的問題:無法訪問對象的方法

出於某種原因,我無法訪問我的課MenuItem的方法:

public class MenuItem { 
    String name; 
    double price; 

    public MenuItem (String name, double price) { 
     this.name = name; 
     this.price = price; 
    } 
    public String getName() { 
     return this.name; 
    } 
    public String toString() { 
     return this.name + "\t" + this.price; 
    } 
} 

在下面的代碼片段我的IDE強調方法getName()紅說:

「找不到符號」

這是代碼:

public static void main(String[] args) { 
    ArrayList<Object> menuItems = new ArrayList<Object>(); 

    menuItems.add(new MenuItem("Pizza", 2.22)); 

    System.out.println(menuItems.get(0).getName()); 
} 

我比較我與其他的代碼代碼,並不能找到任何區別。

不知何故toString()方法工作得很好。它返回this.name + "\t" + this.price;而不是[email protected],它在我刪除該方法時執行。

有沒有人有想法?我真的不明白...

+1

可能重複[什麼是「無法找到符號」編譯錯誤是什麼意思?](https://stackoverflow.com/questions/25706216/what-does-a-cannot-find-symbol-編譯錯誤平均值) –

+1

你認爲'menuItems.get(0)'是什麼類型? – azurefrog

回答

6
ArrayList<Object> menuItems ; 

鍵入以保存Object的引用。它不知道你在Runtime添加什麼。

將其更改爲特定類型的

List<MenuItem> menuItems = new ArrayList<MenuItem>(); 
+0

謝謝,這有幫助。那麼,我認爲ArrayList不可能存放不同類的對象? – barbarossa

+0

這是可能的。你可以擁有像'<?擴展SomeBaseClass>'。詳細瞭解[泛型](https://docs.oracle.com/javase/tutorial/java/generics/index.html) –

0

問題是這一行:ArrayList<Object> menuItems = new ArrayList<Object>();。您正嘗試致電getName(),致電Object,而不是MenuItem

import java.util.*; 

public class MenuItem { 
    String name; 
    double price; 

    public MenuItem (String name, double price) { 
    this.name = name; 
    this.price = price; 
    } 

    public String getName() { 
    return this.name; 
    } 

    public String toString() { 
    return this.name + "\t" + this.price; 
    } 

    public static void main(String[] args) { 
    ArrayList<MenuItem> menuItems = new ArrayList<MenuItem>(); 

    menuItems.add(new MenuItem("Pizza", 2.22)); 
    //System.out.println(menuItems); 
    System.out.println(menuItems.get(0).getName()); 
    } 
} 

或者,如果你想保持列表充滿Object S,你可以明確地投了ObjectMenuItem當你拉項目出象下面這樣:

import java.util.*; 

public class MenuItem { 
    String name; 
    double price; 

    public MenuItem (String name, double price) { 
    this.name = name; 
    this.price = price; 
    } 

    public String getName() { 
    return this.name; 
    } 

    public String toString() { 
    return this.name + "\t" + this.price; 
    } 

    public static void main(String[] args) { 
    ArrayList<Object> menuItems = new ArrayList<Object>(); 

    menuItems.add(new MenuItem("Pizza", 2.22)); 
    //System.out.println(menuItems); 
    MenuItem mi = (MenuItem) menuItems.get(0); 
    System.out.println(mi.getName()); 
    } 
} 
0

試試這個說法

System.out.println(((MenuItem)menuItems.get(0)).getName()); 

(或)

ArrayList<MenuItem> MenuItems = new ArrayList<MenuItem>(); 
menuItems.add(new MenuItem("Pizza", 2.22)); 
System.out.println(menuItems.get(0).getName()); 

在調用方法之前,您需要正確地對它進行類型轉換。希望這會幫助你