如果我有java.util.List并希望迭代它用户Scala语法我导入:
import scala.collection.JavaConversions._
并且java.util.List被隐式转换为scala.collection.mutable.Set
(http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConversions%24)
但这种转换是如何实现的?我很困惑,因为这是我第一次遇到通过导入包转换对象类型的能力。
答案 0 :(得分:3)
JavaConversions
对象包含Scala-> Java和Java-> Scala集合之间的许多隐式转换。导入JavaConversions
的所有成员时,所有这些转换都将放在当前作用域中,因此在立即收集类型不可用时进行评估。
例如,当Scala编译器正在查找类型X
的集合但找不到它时,它还会尝试查找类型为Y
的集合和隐式转换Y to X
在范围内。
要详细了解转化的评估方式,请参阅this answer。
答案 1 :(得分:1)
有一种模式“Pimp my library”允许向任何现有类“添加”方法。例如,请参阅the answer of Daniel C. Sobral,http://www.artima.com/weblogs/viewpost.jsp?thread=179766或google其他示例。
简而言之:一个隐式方法返回一个包含所需方法的包装器:
implicit def enrichString(s:String) = new EnrichedString(s)
class EnrichedString(s:String){
def hello = "Hello, "+s
}
assert("World".hello === "Hello, World")
它也可以用糖缩短:
implicit class EnrichedString(s:String){
def hello = "Hello, "+s
}