12

コードの多くの箇所で、3 つの注釈が一緒に表示されます。

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

どこでnullValue="0"注釈へのパラメータSpacePropertyです。

の単一の型エイリアスを定義することは可能@BeanProperty @(SpaceProperty @beangetter)ですか?

私ができる最善のことは次のとおりです。

type ScalaSpaceProperty = SpaceProperty @beanGetter

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

パラメータが最後のものに適用される 2 つの注釈の型エイリアスを定義することは可能ですか?

4

3 に答える 3

4

いいえ。Scala2.10でこれを行うためのマクロを作成できると思います(ただし、現時点ではドキュメントが利用できないため、確認できません)。

于 2012-11-09T14:56:20.687 に答える
4

私が知っている型エイリアシング アノテーションの唯一の例は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宣言は型のみを扱うことができます。つまり、型エイリアスでインスタンス情報を提供することはできません。

1 つの代替手段は、注釈を拡張しようとすることです。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

このソリューションには小さな問題が 1 つあります。Scala で定義された注釈は、実行時に保持できませんでした。そのため、実行時にアノテーションを使用する必要がある場合は、Java で拡張を行う必要がある場合があります。この制限がすでに修正されているかどうかわからないため、可能性があると言います。

于 2012-11-09T19:35:28.197 に答える
0

これは機能しますか?

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

val myValue: MyAnnotation[MyType] 
于 2012-11-10T20:23:15.457 に答える