将嵌套的Scala类型转换为Java类型
我目前正在处理需要
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的类型 解决方法
编译器根据静态类型插入TypeTag,因此当调用isNestedMap(v)时,它将看到v:Any并插入isNestedMap [A??ny](v)(typeTag [Any]).
就像是 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 ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 指定订单Dockers在Kubernetes pod上运行
- Bootstrap教程--(1)入门篇
- 如何确定scala模块是否作为脚本运行
- angularjs – 将角度材料与twitter引导程序相结合,没有冲突
- scala – 为什么我不能索引到通过映射到另一个HList获得的H
- 如何在Scala中模拟“assign-once”var?
- linx vim 文件操作 ubuntu 软件源
- postgresql – docker postgres无法以指定端口启动
- bash:如何重定向stdin / stderr然后再恢复fd?
- twitter-bootstrap – Bootstrap导航栏品牌重量根据Safari中