返回类型化值的通用方法

时间:2013-07-24 19:00:55

标签: java casting type-conversion

我需要用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。

有办法吗?

1 个答案:

答案 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() );