为什么我不能在Scala中重命名@BeanProperty的导入

时间:2014-04-26 23:20:30

标签: scala javabeans

在Scala中,可以在import语句中使用重命名。 但是,它不能与@ BeanProperty-Annotation一起使用。

这段(无可否认的是无用的)代码:

import java.lang.{ Deprecated => D }
import scala.beans.{ BeanProperty => B }

object Foo {
  @D
  val bar = 1;

  @B
  val baz = 2;
}

使用@B产生编译错误:"实现限制:BeanProperty注释不能用于类型别名或重命名导入"。重命名@Deprecated确实有效。

此限制的技术原因是什么?

1 个答案:

答案 0 :(得分:3)

scala编译器的构建是根据"翼它"模型。在这种情况下,这意味着在符号可用之前决定是否合成getter和setter,因此它会尝试根据它们拼出" BeanProperty"来识别@BeanProperty注释。

换句话说,它不是真正的注释 - 它是源代码上的模式匹配。

def hasAnnotationNamed(name: TypeName) = {
  annotations exists {
    case Apply(Select(New(Ident(`name`)), _), _)     => true
    case Apply(Select(New(Select(_, `name`)), _), _) => true
    case _                                           => false
  }
}