在我的代码的许多方面,三个注释一起出现:
@BeanProperty
@(SpaceProperty @beanGetter)(nullValue="0")
其中nullValue="0"
是注释SpaceProperty
的参数。
是否可以为@BeanProperty @(SpaceProperty @beangetter)
定义单一类型别名?
我能做的最好的事情是:
type ScalaSpaceProperty = SpaceProperty @beanGetter
@BeanProperty
@(ScalaSpaceProperty)(nullValue = "0")
是否可以为两个注释定义一个类型别名,其中参数应用于最后一个?
答案 0 :(得分:4)
没有。我认为你可以编写一个宏来在Scala 2.10中执行此操作(但目前无法提供文档,因此我无法检查)。
答案 1 :(得分:3)
我知道的类型别名注释的唯一示例是Scaladoc。以下是相关部分:
object ScalaJPA {
type Id = javax.persistence.Id @beanGetter
}
import ScalaJPA.Id
class A {
@Id @BeanProperty val x = 0
}
这相当于在A类中写@(javax.persistence.Id @beanGetter) @BeanProperty val x = 0
。
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进行扩展。我说可能因为我不确定这个限制是否已被修改。
答案 2 :(得分:0)
这有用吗?
type MyAnnotation[+X] = @BeanProperty
@(SpaceProperty @beanGetter)(nullValue = 0) X
val myValue: MyAnnotation[MyType]