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实现一个基于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