java - 将嵌套的 Scala 类型转换为 Java 类型

标签 java scala

我目前正在处理 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/

相关文章:

java - 某些情况下的 Joda-Time Period 问题

java - Python - 我如何读入和读出以便其他读者可以阅读它以进一步追求?

scala - 使用Spray json序列化Map [String,Any]

scala - 我怎样才能有一个可选的 Sbt 设置?

scala - Scala 中 Java 反射的类型安全用法

java - 无法在 Java 7 上启用 SNI

java - IOException : Can't read input file. 我找不到使用不同路径的解决方案,即使是手动

Java 图形 JApplet

oop - 为什么 Seq[V] 不扩展 Map[Int,V] 也不 Set[V] 扩展 Map[V,Bool]?

java - 如何让我的 scala 函数更快?