Java 基于内部映射的泛型返回类型?
我有一个函数,它试图将字段名(字符串)映射到类类型,然后能够根据输入字段名将输入字符串转换为正确的类型Java 基于内部映射的泛型返回类型?,java,class,generics,casting,Java,Class,Generics,Casting,我有一个函数,它试图将字段名(字符串)映射到类类型,然后能够根据输入字段名将输入字符串转换为正确的类型 public class Parser { private final Map<String, Class> mapping; public Parser(Map<String, Class> inputMapping){ this.mapping = inputMapping; } public T parseString(String fi
public class Parser {
private final Map<String, Class> mapping;
public Parser(Map<String, Class> inputMapping){
this.mapping = inputMapping;
}
public T parseString(String fieldName, String parseValue){
Object convertedObject;
Class<T> classType = mapping.get(fieldName);
if(classType == String.class) {
convertedObject = parseValue;
} else if (classType == Double.class) {
convertedObject = Double.valueOf(parseValue);
} else {
throw new UnimplementedException("Invalid type");
}
return classType.cast(convertedObject);
}
}
公共类解析器{
私人最终地图测绘;
公共解析器(映射输入映射){
this.mapping=输入映射;
}
公共T parseString(字符串字段名、字符串parseValue){
对象转换对象;
Class classType=mapping.get(fieldName);
if(classType==String.class){
convertedObject=parseValue;
}else if(classType==Double.class){
convertedObject=Double.valueOf(parseValue);
}否则{
抛出新的UnimplementedException(“无效类型”);
}
返回classType.cast(convertedObject);
}
}
我得到了一些错误,比如在引用parseString的返回类型中使用的T时说“找不到符号'T'”。是否仍有方法更正此错误或重新组织函数以使其具有相同的行为
谢谢 您试图在这里执行
解析器
类无法执行的操作
Java方法具有固定的返回类型。它可以是泛型的,但不能在方法内部选择值的返回类型。很明显,返回值可以更改,但返回类型是固定的
这里要做的是将特定字段解析为特定类型。在您试图使用它的意义上,“字段”实际上是一个函数。如果知道所需字段的类型,则必须知道字段的名称。因此,不是:
Integer i = parser.get("int_field", "1"); // Can't do this.
Double d = parser.get("double_field", "1"); // Can't do this.
相反,您可以执行以下操作:
Function<String, Integer> intFieldParser = Integer::parseInt;
Function<String, Double> doubleFieldParser = Double::parseDouble;
Integer i = intFieldParser.apply("1");
Double d = doubleFieldParser.apply("1");
值可以是整数
和双精度
;但是客户端代码必须解决这个问题;您无法在编译时知道它。您无法安全地执行此类型。您所能做的就是返回Object
publictparsestring
@Aominè。。。。这不是类型安全的,因为您可以调用Integer i=parseString(“field”,“parse”)
以及双d=parseString(“字段”,“解析”)
@AndyTurner我没有太注意描述,但肯定解决了OP遇到的编译错误。@Aominè不要将编译时错误更改为运行时错误。前者比后者容易捕捉。
Number i = parser.parse("int_field", "1");
Number d = parser.parse("double_field", "1");