2013-07-24 70 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());