【发布时间】:2017-03-17 18:27:23
【问题描述】:
这个问题是对opensas的另一个问题的回应:building a generic initializer function in java
从他的问题中可以清楚地看出,他需要将任何数据类型T1 转换为另一种类型T2。当我在这里说“数据类型”时,我的意思是仅限于那些通常用于表示原始数据的类型:Integer、String、Date 等。对于这个问题,我们可以考虑将原语装箱。
我想知道是否有任何 API 支持类型之间的转换,其中输入和输出都被泛化为一组受支持的数据类型。我查看了Apache Commons' beanutils.converters package,但每个已知输入都有一个单独的转换器类。我正在寻找任何实现类似以下签名的功能:
static <IN, OUT> OUT convert(IN value, Class<OUT> targetType);
否则
static <IN, OUT> OUT convert(IN value, OUT defaultValue);
自己实现这种映射真的不会太难,要么使用一堆指向各种 Commons 转换器的 else if 块,要么使用 Map<Class<?>, Converter> 用于相同目的。但我想知道某处是否支持这种功能。
另外,如果这最终成为重复,我深表歉意。我尝试寻找类似的问题,但当我发现没有一个符合这种情况时,我感到很惊讶。
编辑:所以这个代码的一个例子是:
Integer i = GenericConverter.convert("123", Integer.class); //returns 123
Date d = GenericConverter.convert(1313381772316L, Date.class); //returns today's date
Boolean b = GenericConverter.convert(0, Boolean.class); //returns false
Long l = GenericConverter.convert("asdf", Long.class); //RuntimeException
更新:我链接的 BalusC 代码接近标记,Bohemian 的答案是一个不错的轻量级解决方案(尽管它不适用于布尔转换)。如果我们想概括这些其他数据类型的转换,他可能应该单独处理日期,他也是对的。不过,我仍然希望得到更多的答案——尤其是如果某个地方有更多的免干预 API 可用。
【问题讨论】:
-
你能展示这段代码吗?不能说我真的能理解你的目标是什么。
-
@Maurício - 添加了一些示例