JVM:Scala的JavaConversions在Java代码中是如何工作的?

4
我知道Scala的JavaConversions会在各种Java和Scala集合之间添加隐式转换。我知道在Scala中使用implicit关键字可以实现这一点。
然而,在我的情况下,我正在运行一些Java代码,它在顶部有以下内容:
import scala.collection.JavaConversions;

现在不知怎么的,似乎魔法般地,在顶部加上那个import之后,当使用Java集合时下面的代码就会发生变化。
例如,我有一个方法:
public static Collection<String> foo() { return ... }

如果我从外部调用该方法,则返回的Collection实例会被某种方式改变。它添加了额外的方法。通过一些我不理解的机制,即使没有涉及到Scala或JavaConversions,该代码也会导致类加载器引入Scala类。
它是如何工作的?
Java语言本身没有implicit关键字或扩展方法,但Scala有。不知何故,导入Scala库正在做一些底层操作(可能)无法在Java中表达,但仍受JVM支持。
当遇到该import时会发生什么?
Scala如何向现有的Java类添加方法?
这里涉及到的时间问题是什么?在import时间、类加载时间还是其他时间点上会发生什么?

我没有使用Scala的JavaConversions,但是你所描述的可以通过Java的Annotation Processor API在编译时修改代码。 - apangin
3
不应该发生这样的事情。我猜测foo()调用了另一个方法,该方法内部确实使用了Scala集合,但如果没有看到代码,我就无法再说更多了。 - Alexey Romanov
1
没有一个自包含的复制,这里真的没有什么有用的话可以说。 - Jasper-M
1
从外部调用那个方法 - 从哪个外部? "以某种方式更改" - 如何更改? 您如何知道它已更改? - jon hanson
1个回答

2
一切都比任何事情都要早得多,发生在Scala编译时。Scala编译器尝试在某些情况下将对一个"视图"的隐式方法的调用插入到代码中,否则会导致类型错误。
foo()返回的Collection只是一个普通的Collection[String]。当你将其用作Scala集合时,在使用它的地方,Scala编译器会插入一个额外的方法调用。因此,如果你写foo().headOption,这将编译为与collectionAsScalaIterableA(foo()).headOption相同的Java字节码,并在运行时表现得像那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接