加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 10:00:27 所属栏目:安全 来源:网络整理
导读:我目前正在处理需要 Java类型的AWS Java SDK. 我一直在使用JavaConverters将地图和列表等类型显式转换为java.我一直在遇到越来越复杂的类型,并发现自己不得不深入地映射到变得笨拙的列表. 我当前的问题是我有一个Map [String,List [String]]将整个对象转换为
我目前正在处理需要 Java类型的AWS Java SDK.

我一直在使用JavaConverters将地图和列表等类型显式转换为java.我一直在遇到越来越复杂的类型,并发现自己不得不深入地映射到变得笨拙的列表.

我当前的问题是我有一个Map [String,List [String]]将整个对象转换为java很简单,但是当匹配地图中的列表时,我会遇到类型擦除.

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
}

并且一个新的案例(k,v)if isNestedMap(v)=> k – > “beans”但是这总是返回false,因为我的方法将类型视为Any.

任何想法如何克服这个?或者更好的方法是递归地将深度列表或映射转换为它们的Java等价物?

谢谢大家.

编辑:Map实际上是一种Map [String,Any],所以在将其转换为Java之前我需要知道Any的类型

解决方法

EDIT: The Map is actually a type of Map[String,Any] so I need to know the type of Any before I can convert it to Java

编译器根据静态类型插入TypeTag,因此当调用isNestedMap(v)时,它将看到v:Any并插入isNestedMap [A??ny](v)(typeTag [Any]).

Or better yet a way of recursively convert deep lists or maps to their java equivalents?

就像是

def deepAsJava(x: Any): Any = x match {
  case l: List[_] => l.map(deepAsJava).asJava
  case m: Map[_,_] => m.map { case (k,v) => (k,deepAsJava(v)) }.asJava
  case ... // other collections you want to support
  case x => x
}

您可以将它拆分为listDeepAsJava等的单独函数,以便为每个函数获得更好的类型签名:

def deepAsJava(x: Any): Any = x match {
  case l: List[_] => listDeepAsJava(l)
  case m: Map[_,_] => mapDeepAsJava(m)
  case ... // other collections you want to support
  case x => x
}

def listDeepAsJava(x: List[Any]): java.util.List[Any] = l.map(deepAsJava).asJava
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读