Ответ 1
Нет. Вы можете написать макрос, чтобы сделать это в Scala 2.10, я думаю (но документация недоступна в данный момент, поэтому я не могу проверить).
Во многих точках моего кода появляются три аннотации:
@BeanProperty
@(SpaceProperty @beanGetter)(nullValue="0")
где nullValue="0"
- параметр аннотации SpaceProperty
.
Можно ли определить псевдоним одного типа для @BeanProperty @(SpaceProperty @beangetter)
?
Лучшее, что я мог сделать, это:
type ScalaSpaceProperty = SpaceProperty @beanGetter
@BeanProperty
@(ScalaSpaceProperty)(nullValue = "0")
Можно ли определить псевдоним типа для двух аннотаций, где параметры применяются к последнему?
Нет. Вы можете написать макрос, чтобы сделать это в Scala 2.10, я думаю (но документация недоступна в данный момент, поэтому я не могу проверить).
Единственный пример аннотаций типа сглаживания, которые я знаю, находится в 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. Я говорю, может, потому что я не уверен, что это ограничение уже было изменено.
Это работает?
type MyAnnotation[+X] = @BeanProperty
@(SpaceProperty @beanGetter)(nullValue = 0) X
val myValue: MyAnnotation[MyType]