scala:如何明确要求隐式转换?

use*_*956 0 scala

在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提供了整洁的方法,asScalaasJava在您需要时执行转换:

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)