如何在Scala中創建一個@interface
?我誠實地感到愚蠢的問這個問題,但我找不到任何地方的語法。我知道你可以使用它們,但是你怎麼在Scala中定義新的?如何在Scala中定義@interface?
的Java:
public @interface MyAnnotation { }
斯卡拉:
???
如何在Scala中創建一個@interface
?我誠實地感到愚蠢的問這個問題,但我找不到任何地方的語法。我知道你可以使用它們,但是你怎麼在Scala中定義新的?如何在Scala中定義@interface?
的Java:
public @interface MyAnnotation { }
斯卡拉:
???
這個答案是基於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
雖然'StaticAnnotation'允許我使用和編譯它們,但我怎樣才能在運行時查詢它們?在Scala中可以找到用'@Retention(RetentionPolicy.RUNTIME)'標記的Java註釋,但我找不到在Scala中定義的'StaticAnnotation',即使我使用運行時保留策略來標記它們。 – 2010-02-15 13:13:14
您或其他人能否舉例說明如何在Java中定義運行時註釋並在Scala中使用它? – Jus12 2011-10-04 07:37:29
Scala 2.9.1中仍存在實現限制。 – mpartel 2012-04-23 23:16:51
如果你想創建斯卡拉你應該混合StaticAnnotation
或ClassAnnotation
性狀的註釋。示例代碼:
class MyBaseClass {}
class MyAnnotation(val p:String) extends MyBaseClass with StaticAnnotation {}
@MyAnnotation("AAA")
class MyClass{}
如何獲取註釋中定義的參數\ d?就像在這種情況下參數值「AAA」? – Ashish 2014-09-15 12:17:08
我不知道它是否真的值得嗎?註釋類往往比較小,所以在Scala中編寫它們並沒有真正的優勢。就像枚舉一樣,把它們寫成Java是可以做到的。 – Martin 2011-07-29 11:11:46