《Programming in Scala 3rd》阅读笔记

Chapter 31《Combining Scala and J

2018-08-31  本文已影响0人  liqing151

从Java角度看Scala

1. 值类型

对于值类型,在能够确定的情况下,优先翻译成为Java中的值类型用以获得更好的性能,如果不能确定,则翻译为包装类型。

2. 单例对象

public final class Test$ {
  public static final Test$ MODULE$;
  public static {};
  public void main(java.lang.String[]);
  public java.lang.String select(java.lang.String[]);
}

其中,编译器插入了代码,保证在运行的时候私有化了Test$的构造方法,并对MODULE$进行了赋值。在Test类中

public final class Test {
  public static java.lang.String select(java.lang.String[]);
  public static void main(java.lang.String[]);
}

Test$中的所有方法在Test中都存在有static的转发版本。在书中说如果object有了对应的class,则在javaclass中不会添加额外的转发方法,但是在实际过程中发现即使有了对应的classjava中的class也添加了额外的转发方法。

3.接口

注解

// Java serial version marker
private final static long SerialVersionUID = 1234L

@transient也是在Java代码上加上同样的注解。

1.异常抛出

class Reader(fname: String) {
    private val in =
        new BufferedReader(new FileReader(fname))
    @throws(classOf[IOException])
    def read() = in.read()
}

2.Java注解

现在的Java框架注解都可以直接应用在Scala代码中。

3.定制注解

如果需要注解在Java反射的时候可以看到,则必须使用Java中的注解,并使用javac来编译它。因为Scala不能完全的支持Java中的注解,使用的反射机制也是Java的。可以这么使用:

import java.lang.annotation.*; // This is Java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Ignore { }

object Tests {
  @Ignore
  def testData = List(0, 1, -1, 5, -5)
  def test1 = {
      assert(testData == (testData.head :: testData.tail))
  }
  def test2 = {
      assert(testData.contains(testData.head))
  }
}
for {
  method <- Tests.getClass.getMethods
  if method.getName.startsWith("test")
  if method.getAnnotation(classOf[Ignore]) == null // 使用的是Java中的反射API,所以比较使用的是null
} {
  println("found a test method: " + method)
}

使用的顺序如下所示:

$ javac Ignore.java
$ scalac Tests.scala
$ scalac FindTests.scala
$ scala FindTests
found a test method: public void Tests$.test2()
found a test method: public void Tests$.test1()

注意到这里是Tests$而不是Tests,因为使用的是Java中的反射API,所以在Tests.getClass.getMethods的时候类就是Tests$,而不是Test,同时注意在Java中的注解参数只能是常量,不能是x*2x是常量这种形式。

通配符类型

同时编译Scala代码和Java代码

在Scala2.12中集成Java8

在Scala2.12中使用Java8中的流

上一篇 下一篇

猜你喜欢

热点阅读