2016-01-23 97 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異常。