Наследование аннотаций Scala

#scala #inheritance #reflection #annotations

#scala #наследование #отражение #аннотации

Вопрос:

В Scala у меня есть аннотация и базовый признак с аннотацией, но расширение этого класса не наследует аннотацию:

 scala> import scala.annotation.StaticAnnotation
import scala.annotation.StaticAnnotation

scala> case class AnnotationClass() extends StaticAnnotation
defined class AnnotationClass

scala> @AnnotationClass trait BaseTrait
defined trait BaseTrait

scala> class InheritingClass extends BaseTrait
defined class InheritingClass

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[BaseTrait].typeSymbol.asClass.annotations.size
res1: Int = 1

scala> typeOf[InheritingClass].typeSymbol.asClass.annotations.size
res0: Int = 0
  

Есть ли способ заставить подкласс наследовать аннотацию родительского класса?

Ответ №1:

Насколько мне известно, это невозможно. Единственное описание области аннотаций в документах гласит:

Предложение аннотации применяется к первому определению или объявлению, следующему за ним. Определению и объявлению может предшествовать более одного пункта аннотации. Порядок, в котором приводятся эти предложения, не имеет значения.

Вероятно, это означает, что аннотация применяется только к первому определению, следующему за ней. Конечно, вы можете создать вспомогательный метод, который проверяет определения в базовых классах:

 def baseAnnotations[T : TypeTag] = typeOf[T].typeSymbol.asClass.baseClasses.flatMap(_.annotations)
baseAnnotations[InheritingClass].size //1
  

Ответ №2:

Хотя расширение признака не наследует аннотации, расширение абстрактного класса приводит к наследованию аннотаций.