我需要用Java编写一个类似的方法:
<T> getProperty(String key, T defaultValue) {
final Object value = this.config.getProperty(key);
return value == null ? defaultValue : (T) value;
}
然而,(T)值几乎可以投掷任何东西。假设我想将属性'enabled'作为布尔值读取,它将抛出异常'无法从String转换为布尔'。我正在寻找C#中的Convert.ChangeType。
有办法吗?
答案 0 :(得分: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() );