Scala Типичные псевдонимы для аннотаций

Во многих точках моего кода появляются три аннотации:

@BeanProperty
@(SpaceProperty @beanGetter)(nullValue="0")

где nullValue="0" - параметр аннотации SpaceProperty.

Можно ли определить псевдоним одного типа для @BeanProperty @(SpaceProperty @beangetter)?

Лучшее, что я мог сделать, это:

type ScalaSpaceProperty = SpaceProperty @beanGetter

@BeanProperty
@(ScalaSpaceProperty)(nullValue = "0")

Можно ли определить псевдоним типа для двух аннотаций, где параметры применяются к последнему?

Ответ 1

Нет. Вы можете написать макрос, чтобы сделать это в Scala 2.10, я думаю (но документация недоступна в данный момент, поэтому я не могу проверить).

Ответ 2

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

object ScalaJPA {
  type Id = javax.persistence.Id @beanGetter
}
import ScalaJPA.Id
class A {
  @Id @BeanProperty val x = 0
}

Это эквивалентно написанию @(javax.persistence.Id @beanGetter) @BeanProperty val x = 0 в классе A.

type объявления могут обрабатывать только типы. Другими словами, вы не можете предоставить информацию об экземпляре в псевдонимах типов.

Один из вариантов - попытаться расширить аннотацию. Ниже я создал гипотетический SpaceProperty для иллюстративных целей:

scala> import scala.annotation._; import scala.annotation.target._; import scala.reflect._;
import scala.annotation._
import scala.annotation.target._
import scala.reflect._

scala> class SpaceProperty(nullValue:String="1",otherValue:Int=1) extends Annotation with StaticAnnotation

scala> class SomeClass(@BeanProperty @(SpaceProperty @beanGetter)(nullValue="0") val x:Int)
defined class SomeClass

scala> class NullValueSpaceProperty extends SpaceProperty(nullValue="0")
defined class NullValueSpaceProperty

scala> class SomeClassAgain(@BeanProperty @(NullValueSpaceProperty @beanGetter) val x:Int)
defined class SomeClassAgain

Использование псевдонима типа:

scala> type NVSP = NullValueSpaceProperty @beanGetter
defined type alias NVSP

scala> class SomeClassAgain2(@BeanProperty @NVSP val x:Int)defined class SomeClassAgain2

Есть одна небольшая проблема с этим решением. Аннотации, определенные в Scala, не могут быть сохранены во время выполнения. Поэтому, если вам нужно использовать аннотацию во время выполнения, вам может потребоваться расширение в Java. Я говорю, может, потому что я не уверен, что это ограничение уже было изменено.

Ответ 3

Это работает?

type MyAnnotation[+X] = @BeanProperty
                        @(SpaceProperty @beanGetter)(nullValue = 0) X

val myValue: MyAnnotation[MyType]