2017-10-13 117 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()); 

在调用方法之前,您需要正确地对它进行类型转换。希望这会帮助你