Scala java转换如何工作?

时间:2013-08-11 15:43:25

标签: scala scala-java-interop

如果我有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

但这种转换是如何实现的?我很困惑,因为这是我第一次遇到通过导入包转换对象类型的能力。

2 个答案:

答案 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. Sobralhttp://www.artima.com/weblogs/viewpost.jsp?thread=179766google其他示例。

简而言之:一个隐式方法返回一个包含所需方法的包装器:

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
}