在scala中是否有一种方法可以明确地要求隐式转换,或者我是否必须始终为此目的定义函数?
import collection.JavaConversions._
...
def toScalaCollections( v:Any ) : Any = {
v match {
case v2:java.lang.Map[Any] => v2.implicitly[ scala.collection.Map[Any] ]
case v2:java.lang.Iterable[Any] => v2.implicitly[ scala.collection.Iterable[Any] ]
...
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种隐含在语言中的运算符?
NB.很明显,我可以通过定义来解决问题
import collection.JavaConversions._
...
def toScalaCollections( v:Any ) : Any = {
v match {
case v2:java.lang.Map[Any] => toScalaMap(v2)
case v2:java.lang.Iterable[Any] => toScalaList(v2)
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的观点是,有可能不必这样做吗?
Vla*_*eev 10
完全不要使用JavaConversions
.这正是为什么有时隐式转换很糟糕的例子.由于Scala集合框架非常复杂并且所有集合都具有多种方法,因此很难控制何时应进行隐式转换.JavaConversions
真的应该被弃用 - 这是Scala社区广泛接受的观点.
请JavaConverters
改用.此API提供了整洁的方法,asScala
并asJava
在您需要时执行转换:
import scala.collection.JavaConverters._
val sm = Map[String, String]("a" -> "b", "c" -> "d")
val jm: java.util.Map[String, String] = sm.asJava
val sm2: Map[String, String] = jm.asScala
assert(sm == sm2)
Run Code Online (Sandbox Code Playgroud)