十六,与java交互

结合scala和java

 

         scala和java高度兼容,因此可以进行互操作,大多数情况下结合这两种语言时并不需要太多顾虑,尽管如此,有时你还是会遇到一些结合java和scala的问题。基本上,scala使用java代码相对于java使用scala代码更容易一些。

 

scala代码如何被翻译

         scala的实现方式是将代码翻译为标准的java字节码。scala的特性尽可能地直接映射为相对等的java特性。但scala中的某些特性(如特质)在java中没有,而还有一些特性(如泛型)与java中的不尽相同,对于这些特性,scala代码无法直接映射为java的语法结构,因此它必须结合java现有的特性来进行编码。这些是一般性的原则,现在我们来考虑一些特例:

         值类型:类似Int这样的值类型翻译成java有两种不同的方式,只要可能就直接翻译为java的int以获得更好的性能,但有时做不到,就翻译为包装类的对象。

         单例对象:scala对单例对象的翻译采用了静态和实例方法相结合的方式。对每一个scala单例对象,编译器都会为这个对象创建一个名称后加美元符号的java类,这个类拥有scala单例对象的所有方法和字段,这个java类同时还有一个名为MODULE$的静态字段,保存该类在运行期创建的一个实例。也就是说,在java中要这样使用scala中的单例对象:单例对象名$.MODULE$.方法名();

         特质:编译任何scala特质都会创建一个同名的java接口,这个接口可以作为java类型使用,你可以通过这个类型的变量来调用scala对象的方法。如果特质中还有已经实现的方法,那么还会生成对应的实现类“特质名$class”。

 

存在类型

         所有java类型在scala中都有对等的概念,这是必要的,以便scala可以访问任何合法的java类。scala中的存在类型实际上主要是用于从scala访问java泛型中的通配类型以及没有给出类型参数的原始类型。存在类型的通用形式如下:

                   type forSome { declarations }

type部分是任意的scala类型,而declarations部分是一个抽象val和type的列表。这个定义解读为:声明的变量和类型是存在但未知的,正如类中的抽象成员那样。这个类型进而被允许引用这些声明的变量和类型,虽然编译器不知道它们具体指向什么。例如对于如下的java语句:

                   Iterator

                   Iterator

在scala中可以用存在类型分别表示为:

                   Iterator[T] forSome { type T }

                   Iterator[T] forSome { type T<: Component }

另外,存在类型也可以使用下划线占位符语法以更简短的方式来写。如果在可以使用类型的地方使用了下划线,那么scala会为你做出一个存在类型,每个下划线在forSome语句中都变成一个类型参数。如前我们在介绍scala的泛型时,指定类型参数上界下界时,使用的就是这种简写的语法。作为示例,我们可以将上述两个语句简写为:

Iterator[_]

                   Iterator[_ <: Component]

 

隐式转换为java类型

 

         在scala和java代码之间传递数据时,如果使用的是容器类库(当然包括数组等),那么可能需要进行一些转换,而scala类库本身就提供了这样的隐式转换库,因此你可以方便地在scala和java之间传递数据。你唯一需要做的是:import scala.collection.JavaConversions._。

 

你可能感兴趣的:(scala)