scala 将 T 类型传递给 Java 构造函数
scala pass T type to Java constructor
我在 scala 2.11/2.12 中使用 Jackson read Yaml val mapper = new ObjectMapper(new YAMLFactory())
,我想我调用的 Java 构造函数是
public <T> T readValue(String content, Class<T> valueType)
此代码有效
def load(): SomeClass {
mapper.readValue[SomeClass](configStr, classOf[SomeClass])
}
但是我想把这个class改成T
mapper.readValue[T](configStr, classOf[T])
错误class type required but T found
我搜了一些改成了
def load[T: ClassTag](): T = {
mapper.readValue[T](configStr, classTag[T].runtimeClass)
}
但是它说没有匹配的构造方法。
classTag[T].runtimeClass
的 return 类型是 Class[?]
,你必须使用 .asInstanceOf
(这种用法是安全的):
mapper.readValue[T](configStr, classTag[T].runtimeClass.asInstanceOf[Class[T]])
请注意,如果您使用的是 Jackson Scala 模块,这些方法已经提供给您以避免样板文件
我在 scala 2.11/2.12 中使用 Jackson read Yaml val mapper = new ObjectMapper(new YAMLFactory())
,我想我调用的 Java 构造函数是
public <T> T readValue(String content, Class<T> valueType)
此代码有效
def load(): SomeClass {
mapper.readValue[SomeClass](configStr, classOf[SomeClass])
}
但是我想把这个class改成T
mapper.readValue[T](configStr, classOf[T])
错误class type required but T found
我搜了一些改成了
def load[T: ClassTag](): T = {
mapper.readValue[T](configStr, classTag[T].runtimeClass)
}
但是它说没有匹配的构造方法。
classTag[T].runtimeClass
的 return 类型是 Class[?]
,你必须使用 .asInstanceOf
(这种用法是安全的):
mapper.readValue[T](configStr, classTag[T].runtimeClass.asInstanceOf[Class[T]])
请注意,如果您使用的是 Jackson Scala 模块,这些方法已经提供给您以避免样板文件