Scala 类库提供了一组用于与Java互操作的注解。我们将在下面介绍这些注解
1、Java修饰符
Java修饰符:对于那些不是很常用的Java特性,Scala使用注解而不是修饰符关键字。
// JVM中将成为volatile的字段
@volatile var done = false
// 在JVM中将成为transient字段,该字段不会被序列化。
@transient var recentLookups = new HashMap[String, String]
@strictfp def calculate(x: Double) = ...
@native def win32RegKeys(root: Int, path: String): Array[String]
2、标记接口
标记接口:Scala用注解@cloneable和@remote 而不是 Cloneable和Java.rmi.Remote“标记接口”来标记可被克隆的对象和远程的对象
@cloneable class Employee
3、受检异常
受检异常:和Scala不同,Java编译器会跟踪受检异常。如果你从Java代码中调用Scala的方法,其签名应包含那些可能被抛出的受检异常。用@throws注解来生成正确的签名。
class Book {
@throws (classOf[IOException]) def read(filename: String) { ... }
...
}
Java版本的方法签名:
void read(String fileName) throws IOException
// 如果没有@throws注解,Java代码将不能捕获该异常
try {//Java代码
book.read("war-and-peace.txt");
} catch (IOException ex) {
...
}
即:Java编译期需要在编译时就知道read方法可以抛IOException异常,否则Java会拒绝捕获该异常。
Scala
class A{
def play() = {
throw new IOExcetion()
}
}
Java
class B{
public static void main(String[] args){
A.play()
}
}
在Scala中抛出异常,在Java中调用这个方法,因为是Scala语法,Java检测不到抛出了异常,所以需要添加异常注解