22

How does one create an @interface in Scala? I honestly feel stupid asking that question, but I can't find the syntax for this anywhere. I know that you can consume them, but how do you actually define new ones in Scala?

Java:

public @interface MyAnnotation { }

Scala:

???
missingfaktor
  • 90,905
  • 62
  • 285
  • 365
Travis Gockel
  • 26,877
  • 14
  • 89
  • 116
  • 1
    I wonder if it is really worth it? Annotation classes tend to be rather small so there is no real advantage in writing them in Scala. Just like enums write them Java an be done with. – Martin Jul 29 '11 at 11:11

2 Answers2

26

This answer is based on 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

For the full details, see section 11 "User Defined Annotations" in the Scala Reference See, for example: @tailrec.

UPDATE The compiler warning says it best:

>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

retronym
  • 54,768
  • 12
  • 155
  • 168
  • While `StaticAnnotation` s allow me to use and compile them, how can I query for them at runtime? A Java annotation marked with `@Retention(RetentionPolicy.RUNTIME)` can be found in Scala, but I cannot find `StaticAnnotation`s defined in Scala even though I'm marking them with a runtime retention policy. – Travis Gockel Feb 15 '10 at 13:13
  • Can you or anyone else give an example of how to define a runtime annotation in Java and use it in Scala? – Jus12 Oct 04 '11 at 07:37
  • The implementation restriction is still present in Scala 2.9.1. – mpartel Apr 23 '12 at 23:16
6

If you want to create an annotation in Scala you should mix StaticAnnotation or ClassAnnotation traits. Example code:

class MyBaseClass  {}  
class MyAnnotation(val p:String) extends MyBaseClass with StaticAnnotation  {}
@MyAnnotation("AAA")  
class MyClass{}  
Nikolay Ivanov
  • 8,897
  • 3
  • 31
  • 34
  • 3
    how do i fetch the parameters define\d in the annotation? Like in this case paramter value "AAA"??? – Ashish Sep 15 '14 at 12:17