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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM:Scala的JavaConversions如何在Java代码中运行?相关的知识,希望对你有一定的参考价值。

据我所知,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时间,课堂加载时间或其他什么事情发生了什么?
答案

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

以上是关于JVM:Scala的JavaConversions如何在Java代码中运行?的主要内容,如果未能解决你的问题,请参考以下文章

scala问题记录

在Scala中使用fastJson

用scala实现一个基于TCP Socket的快速文件传输程序

Spark / Scala - scala.collection.convert.Wrappers$MutableSetWrapper - no valid constructor

Scala Java Error: value filter is not a member of *

如何通过 scala.Float 到 java.Float k/v 转换将 Scala Map 转换为 Java Map