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

Ява:

public @interface MyAnnotation { }

Scala :

???
22
Travis Gockel 15 Фев 2010 в 15:08
1
Интересно, действительно ли оно того стоит? Классы аннотаций, как правило, довольно малы, поэтому их написание на Scala не дает реальных преимуществ. Так же, как перечисления пишут их на Java, и с ними покончено.
 – 
Martin
29 Июл 2011 в 15:11

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

Обсуждение

26
retronym 15 Фев 2010 в 21:13
Хотя StaticAnnotation позволяют мне использовать и компилировать их, как я могу запрашивать их во время выполнения? Аннотации Java, помеченные как @Retention(RetentionPolicy.RUNTIME), можно найти в Scala, но я не могу найти StaticAnnotation, определенные в Scala, хотя я помечаю их политикой сохранения времени выполнения.
 – 
Travis Gockel
15 Фев 2010 в 16:13
Можете ли вы или кто-нибудь еще привести пример того, как определить аннотацию времени выполнения в Java и использовать ее в Scala?
 – 
Jus12
4 Окт 2011 в 11:37
Ограничение реализации все еще присутствует в Scala 2.9.1.
 – 
mpartel
24 Апр 2012 в 03:16

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

class MyBaseClass  {}  
class MyAnnotation(val p:String) extends MyBaseClass with StaticAnnotation  {}
@MyAnnotation("AAA")  
class MyClass{}  
5
Nikolay Ivanov 15 Фев 2010 в 15:32
2
Как мне получить параметры, определяющие \ d в аннотации? Как в этом случае значение параметра "AAA" ???
 – 
Ashish
15 Сен 2014 в 16:17