2013-07-24 98 views
0

通用方法,我需要用Java編寫的東西的方法是這樣的:返回類型的值

<T> getProperty(String key, T defaultValue) { 
    final Object value = this.config.getProperty(key); 
    return value == null ? defaultValue : (T) value; 
} 

然而,(T)值將被扔幾乎所有的東西。假設我想讀取'enabled'屬性作爲布爾值,它會拋出一個異常'不能從字符串轉換爲布爾值'。我正在尋找C#中的Convert.ChangeType。

有沒有辦法?

+0

如果該屬性是一個字符串,你想一個布爾值?不能只是轉換這兩個。另外,你的意思是在代碼片段中使用'propertyName'而不是'key'? –

+0

是的,這是片段中的'關鍵'。已糾正它。是的,屬性值總是一個字符串(我不知道爲什麼它作爲一個對象返回),但我想將其轉換爲我的請求類型。所以我會說getProperty(「enable」,false),並獲取定義的字符串值(「true」或「false」)爲布爾值。 –

+0

在java中沒有這樣的全局轉換機制。你可以自己創造,但是你必須考慮每一種類型(永遠是類)。 –

回答

1

唯一的方法是自己創建一個類型轉換器並使用它。

例如,

Map<String, Object> config = new HashMap<String, Object>(); 
Converter c = new Converter(); 

<T> T getProperty(String propertyName, T defaultValue) { 
    final Object value = this.config.get(propertyName); 
    return value == null ? defaultValue : (T) c.convert(value, defaultValue.getClass()); 
} 

class Converter { 

    <T> T convert(Object value, Class<T> targetClass) { 
     if (targetClass.equals(Boolean.class)) { 
      if (value.equals("true")) 
       return (T) Boolean.TRUE; 
      else 
       return (T) Boolean.FALSE; 
     } else if (targetClass.equals(String.class)) { 
      return (T) value.toString(); 
     } 
     // add more type-specific converters here 
     return (T) value; // no type-specific converters, just trying our luck 
    } 

或者,保持類型安全,替換過去的回報:

if (value.getClass().isAssignableFrom(targetClass)) 
      return (T) value; // no type-specific converters, but cast is safe 
     else 
      throw new ClassCastException(value.getClass().getName() 
        + " cannot be cast to " + targetClass.getName());