Как вы определяете @interface в Scala?

Как создать @interface в Scala? Честно говоря, я чувствую себя глупо, задавая этот вопрос, но я не могу нигде найти синтаксис для этого. Я знаю, что вы можете использовать их, но как вы на самом деле определяете новые в Scala?

Джава:

public @interface MyAnnotation { }

Скала:

???

person Travis Gockel    schedule 15.02.2010    source источник
comment
Интересно, оно того действительно стоит? Классы аннотаций, как правило, довольно малы, поэтому нет никакого реального преимущества в написании их на Scala. Точно так же, как перечисления, напишите их на Java и покончите с этим.   -  person Martin    schedule 29.07.2011


Ответы (2)


Этот ответ основан на 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 См., например: @tailrec.

ОБНОВЛЕНИЕ Лучше всего сказано в предупреждении компилятора:

>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

Обсуждение

person retronym    schedule 15.02.2010
comment
Хотя StaticAnnotation позволяют мне использовать и компилировать их, как я могу запросить их во время выполнения? Аннотацию Java, помеченную @Retention(RetentionPolicy.RUNTIME), можно найти в Scala, но я не могу найти StaticAnnotation, определенные в Scala, хотя я помечаю их политикой хранения во время выполнения. - person Travis Gockel; 15.02.2010
comment
Можете ли вы или кто-либо еще привести пример того, как определить аннотацию времени выполнения в Java и использовать ее в Scala? - person Jus12; 04.10.2011
comment
Ограничение реализации все еще присутствует в Scala 2.9.1. - person mpartel; 24.04.2012

Если вы хотите создать аннотацию в Scala, вы должны смешать черты StaticAnnotation или ClassAnnotation. Пример кода:

class MyBaseClass  {}  
class MyAnnotation(val p:String) extends MyBaseClass with StaticAnnotation  {}
@MyAnnotation("AAA")  
class MyClass{}  
person Nikolay Ivanov    schedule 15.02.2010
comment
как получить параметры define\d в аннотации? Например, в этом случае значение параметра AAA??? - person Ashish; 15.09.2014