无法从Java中的ArrayList访问对象的方法

时间:2016-01-23 06:25:08

标签: java object

Java告诉我在尝试运行main方法时找不到getName()。我不知道为什么,我看了看堆栈交换无济于事。这似乎是一个简单的解决方案,但我似乎无法弄明白。

import java.util.*;

public class ArrayTester
{
    public static ArrayList<Object> array;

    public static void main(String args[])
{
        array = new ArrayList<Object>();
        array.add(new TestObject("Some Name"));
        System.out.println("Object Name: " + array.get(0).getName());
    }
}

对象:

public class TestObject
{
    private String name;

    public TestObject(String cname){
        name = cname;
    }

    public String getName(){
        return name;
    }
}

提前感谢您的帮助。如果在某处我没有看到相同的问题,我道歉。

4 个答案:

答案 0 :(得分:2)

  

Java告诉我,当我尝试运行main时,它找不到getName()   方法

(total - used) / total * 100% = (463.19 - 351.60) / 463.19 * 100% = 111.59 / 463.19 * 100% = 24.091% 类投射到Object类以使用TestObject类的方法。由于TestObjectarray.get(0)类作为对象返回。 Object类中没有这样的方法getName()

变化

Object

System.out.println("Object Name: " + array.get(0).getName());

答案 1 :(得分:1)

您创建了一个名为TestObject的类,因此您应该使用TestObject创建数组,而不是Object

public class ArrayTester
{
    public static ArrayList<TestObject> array;

    public static void main(String args[])
{
        array = new ArrayList<TestObject>();
        array.add(new TestObject("Some Name"));
        System.out.println("Object Name: " + array.get(0).getName());
    }
}

或者至少投下它:

System.out.println("Object Name: " + ((TestObject) array.get(0).getName());

答案 2 :(得分:1)

如果要在ArrayList中存储不同类型的对象,您应该了解这些对象的常见内容。例如,所有这些都有一个名称。然后,您可以创建一个名为TestInterface的接口:

public interface TestInterface {

     String getName();
}

接口定义了getName()方法,实现它的所有类也包含getName()。

TestClass应该实现TestInterface:

public class TestObject implements TestInterface {

     private String name;

     public TestObject(String cname) {
         name = cname;
     }

     public String getName() {
         return name;
     }
 }

你也可以写一个OtherClass:

public class OtherClass implements TestInterface {

     public String getName() {
         return "OtherClass getName method";
     }
}

你的主要:

public class ArrayTester {
     public static ArrayList<TestInterface> array;

     public static void main(String args[]) {
          array = new ArrayList<TestInterface>();
          array.add(new TestObject("Some Name"));
          array.add(new OtherClass());
          for (TestInterface t: array) {
               System.out.println("Object Name: " + t.getName());
          }
     }
}

您可以将实现TestInterface的所有类的实例传递给ArrayList,当您迭代它时,Java会调用getName()方法的具体实现。

输出:

Some Name
OtherCalss getName method

Cast也可以工作,但它不是类型安全的。在Object类型的ArrayList中,您可以传递各种对象。将String传递给它时也可以。它编译,但是当你尝试将String转换为TestObject时,你将有一个ClassCastException。

答案 3 :(得分:0)

您可以使用 instanceof 功能,并在适当的投射前在 if 块中进行比较:

public static void main(String args[])
{
    String name;
    array = new ArrayList<Object>();
    array.add(new TestObject("Some Name"));
    for (Object o : array) {
        if(o instanceof TestObject){
            System.out.println("Object Name: " + ((TestObject) o).getName());
        } 
    }
}

和o是其他类的实例你可以简单地比较它,如果阻塞并在转换后调用相应的函数,如:

public static void main(String args[])
{
    String name;
    array = new ArrayList<Object>();
    array.add(new TestObject("Some Name"));
    for (Object o : array) {
        if(o instanceof TestObject){
            System.out.println("Object Name: " + ((TestObject) o).getName());
        } 
        else if(o instanceof SomeObject){
            System.out.println("Object Name: " + ((SomeObject) o).getSomeObjectFunction());
        }
    }
}

我希望这能解决你的问题。