加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在java中构建通用初始化函数

发布时间:2020-12-15 08:42:55 所属栏目:Java 来源:网络整理
导读:我试图想出一个函数,让我传入任何对象和默认值,如果对象不能被转换为默认值的类型,它应该返回该默认值.如果对象为null,则还应返回默认值. 它应该像这样使用: Integer myVar = ConversionHelper.initialize( "123",0 ) // should return Integer(123)Integer
我试图想出一个函数,让我传入任何对象和默认值,如果对象不能被转换为默认值的类型,它应该返回该默认值.如果对象为null,则还应返回默认值.

它应该像这样使用:

Integer myVar = ConversionHelper.initialize( "123",0 ) // should return Integer(123)
Integer myVar = ConversionHelper.initialize( "hello",0 ) // should return Integer(0)

等等

我尝试使用以下代码:

public static <T> T initialize(Object o,T def) {
    T ret;

    try {
        ret = (T) o;
    } catch (Exception e) {
        ret = def;
    }

    return ret==null ? def : ret;
}

但它失败了基本的转换,比如将一个Integer转换为String.

编辑:从答案中获取了许多建议,现在我正在寻找一种方法来做到这一点,而没有if … elseif … elseif和我的答案中出现的try catch块系列

解决方法

通配符仅作为类型参数有效,而不是类型.在这种情况下,正如您所注意到的那样,普通的旧对象也同样出色.

另一个有效的签名是:

public static <IN,OUT> OUT initialize(IN o,OUT default) { ... }

但在您的情况下,这似乎是不必要的,因为泛型类型是无限的.

至于你在try / catch中使用cast进行转换的策略,我不确定.其他人应该权衡这一部分.

编辑:正如您所发现的那样,除了最简单的数据转换之外,所有内容都非常有限.您可能需要根据in和out类型实现到适当的解析方法调用的映射.

EDIT2:作为你所面对的一个例子,这里有一个人为我正在进行的项目写的数据转换方法:

public static <T> T mapValueString(String valueString,Class<T> targetType) {

  if (valueString == null) {
     return null;
  }
  else if(targetType.equals(String.class)) {
     return (T)valueString;
  }
  else if (targetType.equals(Date.class)) {
     return (T)MyDateTime.parseDate(valueString);
  }
  else if (targetType.equals(Timestamp.class)) {
     return (T)MyDateTime.parseTimestamp(valueString);
  }
  else if (targetType.equals(Boolean.class)) {
     String upperVal = valueString.toUpperCase();
     if (upperVal.startsWith("T")) {
        return (T)Boolean.TRUE;
     }
     else if (upperVal.startsWith("F")) {
        return (T)Boolean.FALSE;
     }
     else {
        throw new RuntimeException("Failed to parse value string into Boolean object. String was " + valueString + ".");
     }
  }
  else if (targetType.equals(Integer.class)) {
     Integer i;
     try {
        i = Integer.parseInt(valueString);
     }
     catch (NumberFormatException nfe) {
        throw new RuntimeException("Failed to parse value string into Integer object. String was " + valueString + ".",nfe);
     }
     return (T)i;
  }
  else if (targetType.equals(Long.class)) {
    Long l;
    try {
       l = Long.parseLong(valueString);
    }
    catch (NumberFormatException nfe) {
       throw new RuntimeException("Failed to parse value string into Long object. String was " + valueString + ".",nfe);
    }
    return (T)l;
  }
  else if (targetType.equals(Double.class)) {
     Double d;
     try {
        d = Double.parseDouble(valueString);
     }
     catch (NumberFormatException nfe) {
        throw new RuntimeException("Failed to parse value string into Double object. String was " + valueString + ".",nfe);
     }
     return (T)d;
  }
  else {
     throw new RuntimeException("Unsupported java type " + targetType.getName() + ".");
  }
}

请注意,这仅用于将String映射到T,您希望将T1映射到T2.有没有更好的办法?也许. SO可以帮助您找到正确的策略吗?当然,但球会在你的球场上提出正确的问题.

EDIT3:Apache Commons’ beanutils.converters可能会有所帮助.我没有尝试过,所以我不能评论它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读