2016-11-19 48 views
2

我想問你,單個方法如何在java中返回不同類型的對象?如何從java中的方法返回不同類型的對象?

可以說我們有一個類「a」。類a是類「b」和「c」的父類。 ,假設我們已經定義爲數組列表:

java.util.ArrayList<a> list; 

因此該列表可以包含一個類,B類和C類的對象。 可以說我們創建了一個類b的對象和一個類c的一個對象,我們將它們添加到列表中。

現在,我想創建這樣的方法:

public ? get_element(boolean first) 
{ 
    if (first) 
    { 
     return list.get(0); 
    } 
    else 
    { 
     return list.get(1); 
    } 
} 

我的問題是,我不知道的地方放了什麼「?」在這個方法中。 如果我把「a」,所以,「公開一個get_element」,當元素被返回時,它總是類型「a」,無論元素最初是何時添加類型「b」或「c」。

但我希望返回的元素是添加元素的類型。所以,如果我在列表的索引0處添加類型「b」的元素,並且在索引1處添加類型「c」的元素,我希望當我調用get_element方法時,如果我提供的參數等於「false」,那返回的元素是「c」類型的,如果我在調用它時提供了true,則返回的元素是b類型的。

當然,我可以將返回的元素轉換爲我希望的類型。但這只是我寫的簡單例子,但我真的有更復雜的情況。我有大約10個類都擴展了一個類,數組列表可以包含任何這11種類型的對象,並且它們可以以任何方式排列,所以我不知道哪個類型的元素在哪個位置,除非我創建一個代碼,它會嘗試將所有類型轉換爲一個一個,直到找到可以投射的類型。

但我想知道,是否有某種更簡單的方法來做到這一點?

簡化我的問題,我寫了這個java文件:

public class test 
{ 
    public static class a{} 
    public static class b extends a{} 
    public static class c extends a{} 
    public static java.util.ArrayList<a> list = new java.util.ArrayList<a>(2); 
    static 
    { 
     b first_object = new b(); 
     c second_object = new c(); 
     list.add(first_object); 
     list.add(second_object); 
     b first_returned_object = get_element(true); 
     c second_returned_object = get_element(false); 
    } 
    public static ? get_element(boolean first) 
    { 
     if (first) 
     { 
      return list.get(0); 
     } 
     else 
     { 
      return list.get(1); 
     } 
    } 
} 

我的問題是,我不知道在GET元法「get_element」之前放什麼。

爲了保存「first_returned_object」中的類型b的對象和「second_returned_object」中的c類型的對象,我該如何放置?

當然,這只是一個例子,我不會使用這些類,因爲它們沒用,但我寫了這個讓我的問題儘可能簡單。

我真正的課程,我有這樣的問題有5000多行,所以我不能在這裏包括這些,所以我寫了最簡單的可能的版本,這表明我的問題。

有什麼建議嗎?

thanx。

post scriptum: to caps lock haters:你的憎恨是雙向的。 ;)

+1

'公衆get_element(布爾第一)'程序的*接口*。 –

+0

Java中不支持多態返回(和多態集合),沒有顯式強制轉換。如果數組列表被聲明爲包含類型「A」,則它可以包含屬於「A」子類型的元素,但不能寫出將返回實際類型的方法,只能將必須投射到「A」類型的引用寫入'如果您需要使用僅出現在「B」或「C」上的方法或公共成員,則可以使用「B」或「C」。 –

+0

這個網站只是針對任何未來的問題,是專業人士使用的。適當時請使用shift鍵。 – 4castle

回答

0

您可以使用泛型來使返回類型變爲動態。

試試這個:

public static <Type> Type get_element(int index) 
{ 
    String s = list.get(index).getClass().toString(); // returns "class class_name" 
    String[] split = s.split(" "); 
    Class<?> theClass = Class.forName(split[1]); // You need "class_name" 

    return (Type) theClass.cast(list.get(index)); 
} 

或者乾脆:

public static <Type> Type get_element(int index) 
{ 
    return (Type) list.get(index); 
} 
+0

乾草Skreweverything, 感謝您的回覆。實際上,雖然我在java中編程了大約一年,但我更新使用了泛型。實際上我甚至不知道這些是什麼,但是,我會立即在java文檔中查找它。無論如何,關於你的帖子,好吧,謝謝你,很多。這確實有用! 如果我將get_element方法替換爲您的方法,則不必再投射返回的對象。 謝謝你,我會查找你的例子和關於泛型的文檔,學習如何使用它,並在我的真實代碼中實現它。 thanx,這裏只是有用的答案。 :) –

相關問題