2010-02-15 21 views
20

¿Cómo se puede crear un @interface en Scala? Sinceramente me siento estúpido al hacer esa pregunta, pero no puedo encontrar la sintaxis para este en cualquier parte. Sé que puedes consumirlos, pero ¿cómo defines los nuevos en Scala?¿Cómo se define una @interface en Scala?

Java:

public @interface MyAnnotation { } 

Scala:

??? 
+1

Me pregunto si realmente vale la pena? Las clases de anotación tienden a ser bastante pequeñas, por lo que no hay una ventaja real al escribirlas en Scala. Al igual que las enumeraciones, escríbelas Java y listo. – Martin

Respuesta

25

Esta respuesta se basa en 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 

Para los detalles completos, véase el capítulo 11 "Definido por el usuario Anotaciones" en el Scala Reference Véase, por ejemplo: @tailrec.

ACTUALIZACIÓN La advertencia del compilador dice mejor:

>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

Si bien 'StaticAnnotic me permite usarlos y compilarlos, ¿cómo puedo consultarlos en tiempo de ejecución? Una anotación Java marcada con '@Retention (RetentionPolicy.RUNTIME)' se puede encontrar en Scala, pero no puedo encontrar 'StaticAnnotation's definido en Scala, aunque los estoy marcando con una política de retención en tiempo de ejecución. –

+0

¿Puede usted u otra persona dar un ejemplo de cómo definir una anotación en tiempo de ejecución en Java y usarla en Scala? – Jus12

+0

La restricción de implementación todavía está presente en Scala 2.9.1. – mpartel

4

Si desea crear una anotación en la Scala se debe mezclar StaticAnnotation o ClassAnnotation rasgos. Código de ejemplo:

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

¿cómo obtengo los parámetros define \ d en la anotación? Como en este caso el valor de paramter "AAA" ??? – Ashish

Cuestiones relacionadas