2013-01-07 127 views
5

我有以下代碼:我怎樣才能限制Java泛型

protected <T> T getValueForKey(String key) { 

    T value = null; 

    // currentStats is just a Bundle 
    if (currentStats.containsKey(key)) { 
     return value; 
    } 
    return value; 
} 

我怎麼能設置限制呢?即例如,T是String或者int或者double。這可能嗎?

P.S.

我不想使用

protected <T extends String> T getValueForKey(String key) { 

} 

因爲我不想隻字符串..

+2

注意:' == '因爲String是final的。 – assylias

+1

protected T getValueForKey(String key,Class resultClass)..設置調用getValue時的返回類型... – anfy2002us

+1

如果您限制輸入值,則可以使用兩個不同的重載,重新限制輸出。 –

回答

6

既然你不能超載的返回值,我建議有不同的存取方法:

protected int  getIntForKey(String key); 
protected double getDoubleForKey(String key); 
protected String getStringForKey(String key); 
2

我不認爲有辦法限制泛型類型隻字符串,整數和雙精度,但您可以使用<T extends Comparable>由於字符串,整數和雙精度都實現了Comparable。 但許多其他類的也實現了媲美像java.util.Date,

+0

這也將允許許多其他類型(例如日期)。我不認爲這是被問到的。 – assylias

+0

@assylias是真的,但你認爲有沒有其他的方法,而不是使用泛型? – PermGenError

+0

不,我不認爲有,這將是一個更合適的答案;-) – assylias

1
protected <T extends Object> T getValueForKey(String key); 

我不知道,反正你可以返回「字符串或整數或雙師型」等

你可以總是添加一些邏輯來檢查返回的對象的類名,並在返回的對象不是您想要的類型之一時拋出異常。

+0

是不是這種方法的危險,你失去了類型安全? –

+0

更新爲使用T擴展對象 – cowls

0

沒有直接的方法來做到這一點。
類型T使用的類必須有一些共同的限制條件,I.E.這是T所有的類必須實現某些接口 - 假設這是InterfaceName

如果className類是包含protected T getValueForKey(String key)類,你就必須聲明類ClassName如下:

class ClassName<T extends InterfaceName> 

一個非常類似的問題已經被問這個網址:

How to restrict types which are allowed as "T" in a generic class?

+0

你能更具體嗎? –

+0

有限制的T型都必須具有一些共同的實現接口 - 它們都實現了什麼樣的接口? (你甚至可以要求T使用逗號分隔列表來實現多個接口) –

0

呼應@ anfy2002us的評論 - 如果它是在CA OK讓ller知道與給定鍵相關聯的值的期望類型,那麼這個怎麼樣?

protected <T> T getValueForKey(String key, Class<T> type) { 
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null; 
}