在java中构建通用初始化函数
我试图想出一个函数,让我传入任何对象和默认值,如果对象不能被转换为默认值的类型,它应该返回该默认值.如果对象为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可能会有所帮助.我没有尝试过,所以我不能评论它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |