gpt4 book ai didi

java - 在 Scala 中将类型作为参数传递

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:06 24 4
gpt4 key购买 nike

我想将类型传递给 Scala 中的函数。

问题详细

第一次迭代

我有以下 Java 类(来自外部源):

public class MyComplexType {
public String name;
public int number;
}

public class MyGeneric<T> {
public String myName;
public T myValue;
}

在这个例子中,我希望 MyComplexType 成为 MyGeneric 的实际类型;在实际问题中有几种可能性。

我想使用 Scala 代码反序列化一个 JSON 字符串,如下所示:

import org.codehaus.jackson.map.ObjectMapper

object GenericExample {
def main(args: Array[String]) {
val jsonString = "{\"myName\":\"myNumber\",\"myValue\":{\"name\":\"fifteen\",\"number\":\"15\"}}"
val objectMapper = new ObjectMapper()
val myGeneric: MyGeneric[MyComplexType] = objectMapper.readValue(jsonString, classOf[MyGeneric[MyComplexType]])
val myComplexType: MyComplexType = myGeneric.myValue
}
}

它编译正常但发生运行时错误:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyComplexType
at GenericExample$.main(GenericExample.scala:9)

第二次迭代

问题的有效解决方案:

val jsonString = "{\"myName\":\"myNumber\",\"myValue\":{\"name\":\"fifteen\",\"number\":\"15\"}}"
val objectMapper = new ObjectMapper()
val myGeneric: MyGeneric[MyComplexType] = objectMapper.readValue(jsonString, classOf[MyGeneric[MyComplexType]])
myGeneric.myValue = objectMapper.readValue(objectMapper.readTree(jsonString).get("myValue").toString, classOf[MyComplexType])
val myComplexType: MyComplexType = myGeneric.myValue

不是很好但很管用。 (如果有人知道如何让它变得更好,那也欢迎。)

第三次迭代

第二次迭代的解决方案中的行在实际问题中多次出现,因此我想创建一个函数。更改变量是 JSON 格式的字符串和 MyComplexType

我想要这样的东西:

def main(args: Array[String]) {
val jsonString = "{\"myName\":\"myNumber\",\"myValue\":{\"name\":\"fifteen\",\"number\":\"15\"}}"
val myGeneric = extractMyGeneric[MyComplexType](jsonString)
val myComplexType: MyComplexType = myGeneric.myValue
}

private def extractMyGeneric[T](jsonString: String) = {
val objectMapper = new ObjectMapper()
val myGeneric = objectMapper.readValue(jsonString, classOf[MyGeneric[T]])
myGeneric.myValue = objectMapper.readValue(objectMapper.readTree(jsonString).get("myValue").toString, classOf[T])
myGeneric
}

这不起作用(编译器错误)。我已经尝试过 ClassClassTagclassOf 的各种组合,但都没有帮助。也有编译器和运行时错误。你知道如何在 Scala 中传递和使用这样的类型吗?谢谢!

最佳答案

使用jackson解析json时,可以使用TypeReference解析 generic 类型。示例:

val jsonString = "{\"myName\":\"myNumber\",\"myValue\":{\"name\":\"fifteen\",\"number\":\"15\"}}"
val objectMapper = new ObjectMapper()
val reference = new TypeReference[MyGeneric[MyComplexType]]() {}
val value: MyGeneric[MyComplexType] = objectMapper.readValue(jsonString, reference)

如果您仍然想使用Jackson,我认为您可以创建一个具有TypeReference 类型的参数。喜欢:

  implicit val typeReference = new TypeReference[MyGeneric[MyComplexType]] {}
val value = foo(jsonString)
println(value.myValue.name)


def foo[T](jsonStr: String)(implicit typeReference: TypeReference[MyGeneric[T]]): MyGeneric[T] = {
val objectMapper = new ObjectMapper()
objectMapper.readValue(jsonStr, typeReference)
}

关于java - 在 Scala 中将类型作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com