【问题标题】:Generic method that returns typed values返回类型值的通用方法
【发布时间】:2013-07-24 19:00:54
【问题描述】:

我需要在 Java 中编写一个类似这样的方法:

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

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

有办法吗?

【问题讨论】:

  • 如果属性是一个字符串并且你想要一个布尔值怎么办?不能只转换这两个。另外,您的意思是在您的 sn-p 中使用 propertyName 而不是 key 吗?
  • 是的,它是 sn-p 中的“关键”。已更正。是的,属性值始终是一个字符串(我不知道为什么它作为对象返回),但我想将它转换为我请求的类型。所以我会说 getProperty("enable", false),并将字符串值定义(“true”或“false”)作为布尔值。
  • java中没有这样的全局转换机制。你可以自己做,但你必须考虑每一种类型(每一个类)。

标签: java casting type-conversion


【解决方案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() );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 2020-10-03
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-04-06
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多