Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于内部映射的泛型返回类型?_Java_Class_Generics_Casting - Fatal编程技术网

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