java通用字符串到<;T>;分析器

java通用字符串到<;T>;分析器,java,generics,string-parsing,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) //

是否有一种直接的方法来实现具有以下签名的方法?实现至少需要处理原语类型(例如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)
//尝试从给定的输入字符串实例化T类型的对象
//如果解析失败,则返回默认值
静态T fromString(字符串输入,T defaultValue)

对于实现了FromString接口(或等效接口)的对象来说,实现将是微不足道的,但我还没有发现任何这样的东西。我还没有找到一个使用反射的函数实现。

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

static <T> T fromString(String input, Class<T> type, T defaultValue)
static T fromString(字符串输入,类类型,T defaultValue)

然后您可以通过
类型
计算类型。具体的例子可以在中找到。

您需要一个以特定方式解析特定类型的对象。显然,仅仅从类型中确定如何解析任意类型是不可能的。此外,您可能希望对解析的完成方式进行一些控制。例如,数字中的逗号可以吗。应该删减空白吗

interface Parser<T> {
    T fromString(String str, T dftl);
}
接口解析器{
T fromString(字符串str,T dftl);
}

在JavaSE8中实现单个抽象方法类型应该不那么冗长。

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

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);
TypeParser=TypeParser.newBuilder().build();
整数i=parser.parse(“1”,Integer.class);
inti2=parser.parse(“42”,int.class);
File f=parser.parse(“/some/path”,File.class);
Set setofits=parser.parse(“1,2,3,4”,新的GenericType(){});
listOfBooleans=parser.parse(“true,false”,新的GenericType(){});
float[]arrayOfFloat=parser.parse(“1.3,4,3.56”,float[].class);

为什么要返回
T
而不是只返回
T
?@Makoto这是一种通用方法<代码>为方法声明类型变量。返回类型被简单地声明为
T
。现在我明白了,谢谢。@Caleb:不简单,也不一般。是的,除非API要求
defaultValue
为非null,否则类型是必需的。@DilumRanatunga您能详细说明一下吗?我可以看到传递null值如何使类型推断变得不可能,但我看不到它如何解决确定t的具体类型的问题。使用
defaultValue.getClass()
将类型获取为
Class
。嗯,测试这个,
defaultValue.getClass()
返回类型
Class
的实例。是否可以避免对类进行未经检查的强制转换?此信息在运行时丢失。每个
T
就是扩展对象的
东西。只需保留未选中的强制转换或添加一个
参数,它也会更好,并避免出现
null
默认值的问题(在您的特定情况下,您在调用该方法时已经知道
T
,否则您将如何指定默认值?)。幸运的是,出于我的目的,对解析机制的精细控制是不必要的。如果解析失败,返回默认值就足够了。