2012-03-30 36 views
8

是否有一个直接的方法来实现一个具有以下签名的方法?至少,实现需要处理基本类型(例如Double和Integer)。非原始类型将是一个很好的奖励。java通用字符串到<T>解析器

//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接口(或同等学历)的对象,但我还没有发现任何这样的事情。我也没有找到使用反射的功能实现。

+0

为什么你试图返回' T',而不只是'T'? – Makoto 2012-03-30 21:50:52

+0

@Makoto这是一个通用的方法。 ''为该方法声明了一个类型变量。返回类型被简单地声明为'T'。 – erickson 2012-03-30 21:53:13

+0

够公平的。现在我明白了,谢谢。 – Makoto 2012-03-30 21:54:56

回答

5

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

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

然后你可以通过type来确定类型。一个具体的例子可以在this blog article中找到。

+2

是的,这个类型是需要的,除非API要求'defaultValue'非空。 – 2012-03-30 22:03:15

+0

@DumumRanatunga你能详细说明一下吗?我可以看到如何传递一个空值会导致类型推断不可能,但我不明白它将如何解决确定T的具体类型的问题。 – cqcallaw 2012-03-30 22:18:20

+1

使用'defaultValue.getClass()'将类型作为'类'。 – BalusC 2012-03-30 22:19:46

1

您想要以特定方式解析特定类型的对象。显然,不可能确定如何仅从该类型解析任意类型。此外,您可能需要对解析完成的方式进行一些控制。例如,逗号可以用数字表示。是否应该删除空白?

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

一个抽象方法类型应该很有希望在Java SE实现8

+0

幸运的是,对我的目的来说,对解析机制的精细控制是不必要的。解析失败时,回退到默认值就足够了。 – cqcallaw 2012-04-01 05:50:58

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);