#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:
Хотя расширение признака не наследует аннотации, расширение абстрактного класса приводит к наследованию аннотаций.