我目前正在处理 AWS Java SDK,它需要 Java 类型。
我一直在使用 JavaConverters
将映射和列表等类型显式转换为 java。我遇到了越来越复杂的类型,发现自己不得不深入映射到越来越笨重的列表中。
我当前的问题是我有一个 Map[String, List[String]]
将整个对象转换为 java 很简单,但是当模式匹配 map 。
val t = m.map{
case (k, v: List[String]) => k -> v //type erasure so unreachable
}
我在 Scala 中找到了关于 Type Tags 的很好的解释,这是我想要实现的一个优雅的解决方案。 Scala: What is a TypeTag and how do I use it?
我只是不确定如何将其实现到我的模式匹配中。
我已经实现了一个看起来像这样的方法
def isNestedMap[A : TypeTag](xs: A): Boolean = typeOf[A] match {
case t if t =:= typeOf[Map[String, List[String]]] => true
case t => false
}
还有一个新案例 case (k, v) if isNestedMap(v) => k -> "beans"
但这总是返回 false,因为我的方法将类型视为 Any
。
任何想法如何克服这个?或者更好的方法是将深度列表或映射递归转换为它们的 Java 等效项?
谢谢大家。
编辑: map 实际上是 Map[String, Any]
的一种类型,因此在将其转换为 Java 之前我需要知道 Any
的类型
最佳答案
我不认为你的问题真的与删除有关,甚至不需要使用类型标签。这是关于 REPL 的快速 session ,演示了一种进行转换的方法:
scala> import collection.JavaConverters._
import collection.JavaConverters._
scala> List(1,2,3).asJava
res0: java.util.List[Int] = [1, 2, 3]
scala> Map(1 -> List(1),2 -> List(2))
res1: scala.collection.immutable.Map[Int,List[Int]] = Map(1 -> List(1), 2 -> List(2))
scala> res1.asJava
res2: java.util.Map[Int,List[Int]] = {1=List(1), 2=List(2)}
scala> res1.map{ case (l,r) => l -> r.asJava}.asJava
res3: java.util.Map[Int,java.util.List[Int]] = {1=[1], 2=[2]}
scala> res1.mapValues(_.asJava).asJava
res5: java.util.Map[Int,java.util.List[Int]] = {1=[1], 2=[2]}
关于java - 将嵌套的 Scala 类型转换为 Java 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436893/