0

我需要用 Java 编写一个方法,如下所示:

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

然而,(T)值几乎会抛出任何东西。假设我想将属性“启用”读取为布尔值,它将引发异常“无法从字符串转换为布尔值”。我正在寻找我们在 C# 中拥有的 Convert.ChangeType。

有办法吗?

4

1 回答 1

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() );
于 2013-07-24T19:33:23.100 回答