java generic <t>解析器的字符串</t>

时间:2012-03-30 21:45:53

标签: java generics string-parsing

是否有直接的方法来实现具有以下签名的方法?至少,实现需要处理原始类型(例如Double和Integer)。非原始类型将是一个很好的奖励。

//Attempt to instantiate an object of type T from the given input string
//Return a default value if parsing fails   
static <T> T fromString(String input, T defaultValue)

对于实现FromString接口(或等效接口)的对象,实现将是微不足道的,但我还没有找到任何这样的东西。我还没有找到使用反射的功能实现。

3 个答案:

答案 0 :(得分:6)

只有在您提供Class<T>作为另一个参数时才有可能。 T本身不包含有关所需返回类型的任何信息。

static <T> T fromString(String input, Class<T> type, T defaultValue)

然后您可以按type计算类型。可以在this blog article中找到具体示例。

答案 1 :(得分:1)

您想要一个以特定方式解析特定类型的对象。显然,不可能确定如何从类型中解析任意类型。此外,您可能希望控制解析的完成方式。例如,数字中的逗号是否正常。是否应修剪空白?

interface Parser<T> {
    T fromString(String str, T dftl);
}

单个抽象方法类型应该不那么冗长,无法在Java SE 8中实现。

答案 2 :(得分:0)

或许没有回答如何实现解决方案的问题,但是有一个库可以做到这一点(即具有与请求几乎相同的API)。它被称为type-parser,可以使用类似的东西:

TypeParser parser = TypeParser.newBuilder().build();

Integer i = parser.parse("1", Integer.class);
int i2 = parser.parse("42", int.class);
File f = parser.parse("/some/path", File.class);

Set<Integer> setOfInts = parser.parse("1,2,3,4", new GenericType<Set<Integer>>() {});
List<Boolean> listOfBooleans = parser.parse("true, false", new GenericType<List<Boolean>>() {});
float[] arrayOfFloat = parser.parse("1.3, .4, 3.56", float[].class);