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

问题描述 投票:3回答:1

据我所知,Scala的JavaConversions在各种Java和Scala集合之间添加了隐式转换。我用implicit关键字了解它在Scala中是如何工作的。

但是,就我而言,我正在运行一些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时间,课堂加载时间或其他什么事情发生了什么?
java scala jvm extension-methods implicit
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.