2010-08-23 106 views
2

我有幾個程序,爲了簡單起見,如下所示:Java:一種具有多種返回類型的函數......泛型可能嗎?

public String fetchValueAsString(String key); 
public DateTime fetchValueAsDateTime(String key); 

我想是這樣

public <X is a String or a DateTime> X fetchValue(String key); // pseudo-code 

,我可以這樣調用(不含鑄造;類型是隱含的通過傳遞參數):

String str = fetchValue("subject"); 
DateTime dt = fetchValue("startDate"); 

我知道我可能只是有一個返回的對象類型的一種方法,只是做一個鑄件轉換,BU t我想知道是否有一種方法可以只調用一種方法,並以某種方式使用泛型來確定返回值。那麼,Java(it is in C#)有可能嗎?

+0

我認爲'getString'和'getDateTime'可能是一個非常好的主意。 – 2010-08-24 00:18:52

+1

我認爲你是對的;我是[Greenspunning](http://en.wikipedia.org/wiki/Greenspun%27s_Tenth_Rule)。 – Generics 2010-08-24 01:26:22

回答

4

當然,但只有當數據類型被傳入的參數所暗示時纔有效。

我可以聲明如下,並沒有錯誤:

public static <T> T parseString(String s) { 
    return (T) new Date(); 
} 

public static void test() { 
    Date dt = parseString("date"); 
} 

但結果到這種事情是你解析函數的內部將不得不能看串並確定目標類型和它將不得不在其身體內進行大量的投射才能正常工作。

你的問題留下了一些含糊不清的問題,或者你真正想要的是讓接收器的類型決定調用的方法還是方法內部的行爲。這是AFAIK不可能的。一旦你使用了這個方法,你所需要處理的就是字符串。

+0

但它當然是「不安全的」。 – 2010-08-24 00:16:00

+0

他沒問過它是否安全。 – Jherico 2010-08-24 00:33:03

+0

我沒問過它是否安全。 – Generics 2010-08-24 01:23:04

1

因爲類型擦除,在Java中的返回類型必須在明確傳遞:

public <X> X fetchValue(Class<X> type, String key); 

如果你知道值將是正確的類型,不管你做什麼,而不是必須通過類<X>,並且您可以在實現中簡單地執行強制轉換(X)。但是,你會得到一個編譯器警告。通過傳入類<X>,您可以安全地執行type.cast(value),並且更重要的是嘗試將其轉換爲正確的類型(如果尚未具有該類型的話)。

+0

只有類型不隱含在密鑰中 – Jherico 2010-08-23 23:53:36

+0

不是密鑰是字符串嗎? – 2010-08-23 23:54:55

+0

它的字符串可能編碼了一些信息,可能只是數據,但可能包含一個類型。考慮「日期:2010-03-01」與「2010-03-01」 – Jherico 2010-08-23 23:55:46