Как вы определяете @interface в Scala? - PullRequest
21 голосов
/ 15 февраля 2010

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

Java:

public @interface MyAnnotation { }

Scala:

???

Ответы [ 2 ]

26 голосов
/ 15 февраля 2010

Этот ответ основан на 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.

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

>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

Обсуждение

5 голосов
/ 15 февраля 2010

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

class MyBaseClass  {}  
class MyAnnotation(val p:String) extends MyBaseClass with StaticAnnotation  {}
@MyAnnotation("AAA")  
class MyClass{}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...