我理解Scala的JavaConversions在各种Java和Scala集合之间添加了隐式转换。我了解Scala如何使用implicit
关键字。
但是,就我而言,我正在运行一些Java代码,它位于顶部:
import scala.collection.JavaConversions;
现在不知怎的,似乎是通过魔术,当使用Java集合时,在顶部使用import
更改下面的代码。
例如,我有一个方法:
public static Collection<String> foo() { return ... }
如果我从外部调用该方法,我回来的Collection
实例会被改变,不知何故。它增加了额外的方法。通过一些我不明白的机制,该代码 - 根本不涉及Scala或JavaConversions - 导致类加载器引入Scala类。
它是如何运作的?
Java语言本身没有implicit
关键字或扩展方法,但Scala可以。不知何故,导入Scala库正在做一些低级的事情(可能)不能用Java表达,但JVM仍然支持它。
import
时会发生什么?import
时间,在课堂加载时间或其他时间发生了什么事情?答案 0 :(得分:2)
在Scala编译时,所有事情都比任何事情都早。 The Scala compiler attempts to insert a call to an implicit
method as a "view" in some cases that would otherwise be type errors
您从Collection
返回的foo()
只是一个普通的Collection[String]
。在您使用它作为Scala集合时,Scala编译器会插入额外的方法调用。因此,如果您编写foo().headOption
,这将编译为相同的Java字节码,就像您编写collectionAsScalaIterableA(foo()).headOption
一样,并在运行时表现得如此。