2016-01-23 64 views
1

Java告诉我,当我尝试运行主方法时找不到getName()。我不知道为什么,我已经四处张望stackexchange无济于事。这似乎是这样一个简单的解决方案,但我似乎无法弄清楚。无法从Java中的ArrayList访问对象的方法

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

感谢您的帮助提前。我很抱歉,如果有一个相同的问题,我没有看到。

回答

2

Java的告诉我,它可以” t找到getName()当我尝试运行主 方法

铸造Object类到TestObject类使用TestObject类的方法。由于array.get(0)返回Object类作为对象。没有这样的方法意味着getName()存在于Object类。

变化

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

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

这工作,非常感谢。我没有想过需要这种方式。 – LordValkyrie

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()); 
+0

尽管如此,我还是想创建一个可以接受不同类型对象的数组列表,而不仅仅是TestObjects。 – LordValkyrie

+0

so just cast Object –

0

您可以使用的instanceof功能,它在如果块之前适当的铸造比较:

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

邻,是实例其他一些类,如果块和呼叫铸造等之后,相应的功能,您可以简单的比较一下:

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

我希望这将解决您的问题。

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

你可以通过实例哪些对ArrayList实现TestInterface,并在迭代它时,Java调用con getName()方法的克里特实现。

输出:

Some Name 
OtherCalss getName method 

演员也能正常工作,但它不是类型安全的。在Object类型的ArrayList中,您可以传递各种对象。当你向它传递一个字符串时也是可以的。它编译,但是当你试图将字符串强制转换为TestObject时,你将有一个ClassCastException异常。