2013-01-10 23 views
0

我有兩個非常相似的方法,我想合併它們(在泛型的幫助下)。但是,他們有不同的回報類型。我能做什麼?如何在Java方法中使用兩種不同的返回類型?

public static <A, B> A veggie(MyList <Box<A, B>> b, int j) { 

     A veggieA = b.head.first; 
     return veggieA; 
    } 

    public static <A, B> B veggie2(MyList <Box<A, B>> b, int j) { 

     B veggieB = b.head.second; 
     return veggieB; 
    } 

回答

0
  • 你不能聲明的是,方法可以返回類型X或Y型,除非 X或Y是其他的超類型(在這種情況下,其他 亞型也可以返回)
  • 您不能聲明兩種方法僅在返回類型上有所不同
1

在Java 7中,您無法單獨通過返回類型進行區分。Java 6有一個允許您執行此操作的錯誤,但我不建議使用它。

這意味着你不能將它們合併而不使返回類型Object或做一個未經檢查的轉換,這不是一個好主意。

在你的例子中,我會讓方法名稱不同,所以很明顯你會得到第一個或第二個。

0

您可以將方法的返回類型更改爲AB都使用的公用類。但是,假設兩個AB延長Base您可以使用此:

public static BaseClass veggie(MyList <Box<A, B>> b, int j) { 
    BaseClass veggie; 
    // Do things 
    return veggie; 
} 

由於要合併這兩種方法,我想這AB有一些共同點。如果不是這種情況,則可以使用Object類作爲返回類型。

0

將方法返回類型更改爲對象。使用instanceof操作符可以區分。

public static Object veggie(MyList <Box<A, B>> b, int j) { 
    if(some_condition){ 
     A veggieA = b.head.first; 
     return veggieA; 
    }else{ 
     B veggieB = b.head.second; 
     return veggieB; 
    } 
} 

. 
. 
. 

Object obj=veggie(b,j); 
if (obj instanceof <A, B> A) { 
    do something  
else{ 
    do something 
} 
0

在這種情況下類A和B必須實現相同的接口,例如C. 當A和B實現C,可寫:

public static <C, A extends C, B extends C> C veggie1(MyList <Box<A, B>> b, int j) { 
    C veggieA = b.head.first; 
    return veggieA; 
} 

public static <C, A extends C, B extends C> C veggie2(MyList <Box<A, B>> b, int j) { 
    C veggieB = b.head.second; 
    return veggieB; 
} 

所以,如果你想將它們合併現在你需要一個參數傳遞給指定是否要第一或第二的方法。

例如:

public static <C, A extends C, B extends C> C veggie(MyList <Box<A, B>> b, int j, boolean first) { 
    C veggie; 
    if (first) 
    veggie = b.head.first; 
    else 
    veggie = b.head.second; 
    return veggie; 
} 
相關問題