在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确实有效。
此限制的技术原因是什么?
答案 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
}
}