2010-02-15 61 views
20

如何在Scala中創建一個@interface?我誠實地感到愚蠢的問這個問題,但我找不到任何地方的語法。我知道你可以使用它們,但是你怎麼在Scala中定義新的?如何在Scala中定義@interface?

的Java:

public @interface MyAnnotation { } 

斯卡拉:

??? 
+1

我不知道它是否真的值得嗎?註釋類往往比較小,所以在Scala中編寫它們並沒有真正的優勢。就像枚舉一樣,把它們寫成Java是可以做到的。 – Martin 2011-07-29 11:11:46

回答

25

這個答案是基於Scala的2.8。

// Will be visible to the Scala compiler, but not in the class file nor at runtime. 
// Like RetentionPolicy.SOURCE 
final class MyAnnotation extends StaticAnnotation 

// Will be visible stored in the annotated class, but not retained at runtime. 
// This is an implementation restriction, the design is supposed to support 
// RetentionPolicy.RUNTIME 
final class MyAnnotation extends ClassfileAnnotation 

有關詳情,請參閱第11的Scala Reference 見 「用戶定義的註釋」,例如:@tailrec

UPDATE編譯器警告最好說它:

>cat test.scala 
final class MyAnnotation extends scala.ClassfileAnnotation 

@MyAnnotation 
class Bar 

>scalac test.scala 
test.scala:1: warning: implementation restriction: subclassing Classfile does not 
make your annotation visible at runtime. If that is what 
you want, you must write the annotation class in Java. 
final class MyAnnotation extends scala.ClassfileAnnotation 

Discussion

+0

雖然'StaticAnnotation'允許我使用和編譯它們,但我怎樣才能在運行時查詢它們?在Scala中可以找到用'@Retention(RetentionPolicy.RUNTIME)'標記的Java註釋,但我找不到在Scala中定義的'StaticAnnotation',即使我使用運行時保留策略來標記它們。 – 2010-02-15 13:13:14

+0

您或其他人能否舉例說明如何在Java中定義運行時註釋並在Scala中使用它? – Jus12 2011-10-04 07:37:29

+0

Scala 2.9.1中仍存在實現限制。 – mpartel 2012-04-23 23:16:51

4

如果你想創建斯卡拉你應該混合StaticAnnotationClassAnnotation性狀的註釋。示例代碼:

class MyBaseClass {} 
class MyAnnotation(val p:String) extends MyBaseClass with StaticAnnotation {} 
@MyAnnotation("AAA") 
class MyClass{} 
+2

如何獲取註釋中定義的參數\ d?就像在這種情況下參數值「AAA」? – Ashish 2014-09-15 12:17:08

相關問題