2010-02-15 11 views
20

Wie erstellt man eine @interface in Scala? Ich fühle mich ehrlich gesagt dumm, wenn ich diese Frage stelle, aber ich kann die Syntax für diese nirgends finden. Ich weiß, dass du sie konsumieren kannst, aber wie definierst du eigentlich neue in Scala?Wie definierst du ein @interface in Scala?

Java:

public @interface MyAnnotation { } 

Scala:

??? 
+1

Ich frage mich, ob es das wirklich wert ist? Anmerkung Klassen neigen dazu, eher klein zu sein, so dass es keinen wirklichen Vorteil gibt, sie in Scala zu schreiben. Genau wie Enums schreiben sie Java und machen damit fertig. – Martin

Antwort

25

Diese Antwort auf Scala 2.8 basiert. @tailrec:

// 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 

Für weitere Informationen, Kapitel 11 "User Defined Anmerkungen" in dem Scala Reference Siehe zum Beispiel sehen.

UPDATE Der Compiler Warnung sagt es am besten:

>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

Während 'StaticAnnotation's mir erlauben, sie zu verwenden und zu kompilieren, wie kann ich sie zur Laufzeit abfragen? Eine Java-Annotation, die mit '@Retention (RetentionPolicy.RUNTIME) markiert ist, kann in Scala gefunden werden, aber ich finde' StaticAnnotation's, die in Scala definiert sind, obwohl ich sie mit einer Laufzeit-Aufbewahrungsrichtlinie markiere. –

+0

Können Sie oder jemand anderes ein Beispiel geben, wie Sie eine Laufzeitanmerkung in Java definieren und in Scala verwenden? – Jus12

+0

Die Implementierungseinschränkung ist in Scala 2.9.1 noch vorhanden. – mpartel

4

Wenn Sie eine Anmerkung in Scala erstellen sollten Sie StaticAnnotation oder ClassAnnotation Züge mischen. Beispielcode:

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

Wie hole ich die Parameter define \ d in der Annotation? Wie in diesem Fall Parameterwert "AAA" ??? – Ashish