是否有直接的方法来实现具有以下签名的方法?至少,实现需要处理原始类型(例如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接口(或等效接口)的对象,实现将是微不足道的,但我还没有找到任何这样的东西。我还没有找到使用反射的功能实现。
答案 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);