JVM:Scala的JavaConversions如何在Java代码中运行?

时间:2017-11-28 20:10:34

标签: java scala jvm extension-methods implicit

我理解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时会发生什么?
  • Scala如何向现有Java类添加方法?
  • 这里涉及的时间是什么?在import时间,在课堂加载时间或其他时间发生了什么事情?

1 个答案:

答案 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一样,并在运行时表现得如此。