4

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

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

4

2 回答 2

3

JavaConversionsobject 包含 Scala->Java 和 Java->Scala 集合之间的许多隐式转换。当您导入 的所有成员时JavaConversions,所有这些转换都放在当前范围内,因此在没有立即集合类型可用时进行评估。

例如,当 Scala 编译器在寻找类型的集合X但找不到它时,它也会尝试查找类型的集合Y和范围内的隐式转换Y to X

要了解有关如何评估转换的更多信息,请参阅答案。

于 2013-08-11T15:56:55.690 回答
1

有一种模式“Pimp my library”允许向任何现有类“添加”方法。参见Daniel C. Sobral 的答案http://www.artima.com/weblogs/viewpost.jsp? thread=179766或谷歌其他示例。

简而言之:隐式方法返回具有所需方法的包装器:

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
}
于 2013-08-13T17:15:01.207 回答