我想將類型傳遞給Scala中的函數。在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
}
這不起作用(編譯錯誤)。我已經玩過Class
,ClassTag
,classOf
的各種組合,但都沒有幫助。還有編譯器和運行時錯誤。你知道如何通過以及如何在Scala中使用這樣的類型嗎?謝謝!
謝謝你的回答!爲了擴展它:'TypeReference'應該被導入,如下所示:'import org.codehaus.jackson。\'type \'.TypeReference'。 –
這是「第一次迭代」問題的不錯解決方案,謝謝!但是,它並沒有解決「第三次迭代」中提出的問題,即主要問題。這仍然是開放的;事實上還有其他一些事情要做,因此創建一個單獨的函數會很好。最直接的解決方案(將MyGeneric [MyComplexType]作爲泛型傳遞)導致運行時錯誤java.lang.ClassCastException:java.util.LinkedHashMap不能轉換爲MyGeneric。 –
@CsabaFaragó你可以檢查我的更新,希望它可以幫助你。 – chengpohi