Scala 如何将泛型类型设置为反射类型变量?
我有一个接受泛型类型的类,但我想在运行时使用Reflect.type变量将泛型类型传递给该类。课程记录如下: 我编写了一个函数,它将泛型类型类名列表作为字符串接受,并使用反射将它们映射到相应的泛型类型Scala 如何将泛型类型设置为反射类型变量?,scala,generics,reflection,Scala,Generics,Reflection,我有一个接受泛型类型的类,但我想在运行时使用Reflect.type变量将泛型类型传递给该类。课程记录如下: 我编写了一个函数,它将泛型类型类名列表作为字符串接受,并使用反射将它们映射到相应的泛型类型 def getGenericTypeByName(names: Map[String, String]): Map[String, reflect.Type] = { val declaredFields = Types.getClass.getDeclaredFields.toSeq;
def getGenericTypeByName(names: Map[String, String]): Map[String, reflect.Type] = {
val declaredFields = Types.getClass.getDeclaredFields.toSeq;
val types: Map[String, reflect.Type] = names.map(s => {
val fieldType = declaredFields.find(_.getName.equals(s._2)).getOrElse(null);
if (fieldType != null) {
(s._1, fieldType.getGenericType);
} else {
(s._1, null);
}
});
}
返回值是Reflect.Type的映射,它应该可以传递到类中的泛型类型参数,因此我应该能够做到:
types.map(s => this.GenericClassMap.get(s._1).get.read[s._2]());
但是当我编译时,我得到了错误无法解析符号\u 2
这里少了什么_2应该是可访问的,因为它是一个映射,并且它是一个反射类型,我认为它也应该与泛型类型匹配。您试图在需要类型的地方使用计算值。类型值与类型不同。因此,找不到
s._2
。如果知道t
是什么,您将无法以这种方式调用read[t]()
方法。如果编译时已知T
,则可以match
与该值匹配,并在matching子句中调用read[T]()
。这一问题的答案取决于您试图对(擦除的)类型执行的操作。您能否同时提供正在调用的read
方法?简而言之,您需要向方法添加一个隐式ClassTag
或TypeTag
参数。