注释
Annotation ::= ‘@’ SimpleType {ArgumentExprs}
ConstrAnnotation ::= ‘@’ SimpleType ArgumentExprs
定义
注释将元信息与定义相关联。一个简单的注释形式为 @´c´ 或 @´c(a_1, ..., a_n)´。其中,´c´ 是类 ´C´ 的构造函数,该类必须符合 scala.Annotation 类。
注释可以应用于定义、类型或表达式。定义的注释出现在该定义之前。类型的注释出现在该类型之后。表达式的注释出现在该表达式之后,用冒号隔开。多个注释子句可以应用于一个实体。这些注释的给出顺序无关紧要。
示例
@deprecated("Use D", "1.0") class C { ... } // Class annotation
@transient @volatile var m: Int // Variable annotation
String @local // Type annotation
(e: @unchecked) match { ... } // Expression annotation
预定义注释
预定义注释位于 scala.annotation 包中,也位于 scala 包中。
Scala 编译器注释
@tailrec标记一个方法,该方法必须由编译器转换以消除尾部位置的自递归调用。如果没有这样的调用,或者递归调用不在尾部位置,则会发生错误。@switch标记提交给匹配的表达式为“可切换”,以便匹配可以编译成高效的形式。如果表达式的类型不是可切换类型,编译器将发出警告。某些退化的匹配可能在没有警告的情况下仍然无法优化。@unchecked当应用于match表达式的选择器时,此属性会抑制任何关于非穷举模式匹配的警告,否则这些警告将被发出。例如,对于下面的方法定义或类似的值定义,不会产生任何警告。def f(x: Option[Int]) = (x: @unchecked) match { case Some(y) => y } val Some(y) = x: @unchecked如果没有
@unchecked注解,Scala 编译器可以推断出模式匹配是非穷举的,并发出警告,因为Option是一个sealed类。@uncheckedStable当应用于值定义时,它允许定义的值出现在路径中,即使它的类型是 易变的。例如,以下成员定义是合法的type A { type T } type B @uncheckedStable val x: A with B // volatile type val y: x.T // OK since `x' is still a path如果没有
@uncheckedStable注解,标识符x不会是路径,因为它的类型A with B是易变的。因此,引用x.T将是非法的。
当应用于没有易变类型的值定义时,注解没有效果。
@specialized当应用于类型参数的定义时,此注解会导致编译器生成针对基本类型专门化的定义。可以提供一个可选的基本类型列表,在这种情况下,专门化只考虑这些类型。例如,以下代码将为Unit、Int和Double生成专门化的特征scala trait Function0[@specialized(Unit, Int, Double) T] { def apply: T }每当表达式的静态类型与定义的专门化变体匹配时,编译器将使用专门化版本。有关实现的更多详细信息,请参阅 专门化 SID。
弃用注解
@deprecated(message: <stringlit>, since: <stringlit>)
将定义标记为已弃用。对定义实体的访问会导致编译器发出弃用警告,其中包含 message<stringlit>。参数 since 文档记录了从何时开始应将定义视为已弃用。
在属于已弃用定义的代码中,弃用警告会被抑制。@deprecatedName(name: <stringlit>, since: <stringlit>)
将形式参数名称标记为已弃用。使用命名参数语法调用此实体并引用已弃用的参数名称会导致弃用警告。
Java 平台注解
注解子句的含义取决于实现。在 Java 平台上,以下注解具有标准含义。
@transient标记一个字段为非持久化;这等同于 Java 中的transient修饰符。@volatile标记一个字段,该字段的值可以在程序控制之外发生变化;这等同于 Java 中的volatile修饰符。@SerialVersionUID(<longlit>)将一个序列化版本标识符(一个long常量)附加到一个类。这等同于 Java 中以下字段定义
private final static SerialVersionUID = <longlit>
@throws(<classlit>)Java 编译器通过分析方法或构造函数执行可能产生的已检查异常来检查程序是否包含已检查异常的处理程序。对于每个可能的结果已检查异常,方法或构造函数的throws子句必须提及该异常的类或该异常类的超类之一。
Java Bean 注解
@scala.beans.BeanProperty当在某个变量X的定义之前加上此注解时,它会导致在包含该变量的类中添加 Java Bean 风格的 getter 和 setter 方法getX、setX。变量的第一个字母在get或set之后大写。当注解添加到不可变值定义X的定义时,只生成 getter。这些方法的构造是代码生成的一部分;因此,这些方法只有在包含类的类文件生成后才会可见。@scala.beans.BooleanBeanProperty此注解等同于scala.reflect.BeanProperty,但生成的 getter 方法名为isX而不是getX。
用户定义的注解
其他注解可能由平台或应用程序相关的工具解释。类 scala.annotation.Annotation 是用户定义注解的基类。它有两个子特征
scala.annotation.StaticAnnotation:此特征子类的实例将存储在生成的类文件中,因此可供运行时反射和后续编译运行访问。scala.annotation.ConstantAnnotation:此特征子类的实例只能具有 常量表达式 作为参数,并且也存储在生成的类文件中。- 如果注解类既不继承自
scala.ConstantAnnotation也不继承自scala.StaticAnnotation,则其实例仅在分析它们的编译运行期间在本地可见。
主机平台注解
主机平台可以定义自己的注解格式。这些注解不扩展 scala.annotation 包中的任何类,但通常可以与 Scala 注解一样使用。主机平台可能会对作为注解参数有效的表达式施加额外的限制。