2012-11-09 32 views
10

Trong nhiều điểm mã của tôi, ba chú thích xuất hiện cùng nhau:Scala Loại bí danh cho các chú thích

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

nơi nullValue="0" là một tham số để chú thích SpaceProperty.

Có thể xác định bí danh loại duy nhất cho @BeanProperty @(SpaceProperty @beangetter) không?

Điều tốt nhất tôi có thể làm là:

type ScalaSpaceProperty = SpaceProperty @beanGetter 

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

Có thể định nghĩa một kiểu bí danh cho hai chú thích nơi các thông số được áp dụng cho người cuối cùng?

+0

Bạn đang sử dụng Scala với GigaSpaces? Wow! – Madoc

+0

http://edmondo1984.squarespace.com/ – Edmondo1984

Trả lời

4

No. Bạn có thể viết macro để làm điều này trong Scala 2.10, tôi nghĩ (nhưng tài liệu hiện không có sẵn, vì vậy tôi không thể kiểm tra).

+6

Bạn không thể viết macro cho điều này trong phiên bản 2.10.0. Có lẽ tính năng này sẽ biến nó thành 2.10.1, nhưng tôi không chắc chắn. –

3

Ví dụ duy nhất về chú thích bí danh loại tôi biết là trong Scaladoc. Dưới đây sau phần có liên quan:

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

này tương đương với văn bản @(javax.persistence.Id @beanGetter) @BeanProperty val x = 0 trong lớp A.

type tờ khai chỉ có thể đối phó với các loại. Nói cách khác, bạn không thể cung cấp thông tin cá thể trong bí danh loại.

Một giải pháp thay thế là cố gắng mở rộng chú thích. Dưới đây tôi tạo ra một giả thuyết SpaceProperty cho mục đích minh họa:

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 

Sử dụng các loại bí danh:

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

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

Có một vấn đề nhỏ với giải pháp này. Chú thích được xác định trong Scala không thể được giữ lại trong thời gian chạy. Vì vậy, nếu bạn cần sử dụng chú thích trong thời gian chạy, bạn có thể cần phải làm phần mở rộng trong Java. Tôi nói có thể vì tôi không chắc liệu giới hạn này đã được sửa đổi chưa.

0

Tính năng này có hoạt động không?

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

val myValue: MyAnnotation[MyType] 
Các vấn đề liên quan