2011-08-23 7 views
10

consideran este código:¿Por qué las interfaces no están permitidas como miembros de anotación?

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Bar { 
    Foo foo() default FooImpl.FooConstant; 
} 

de error del compilador:

annotation value not of an allowable type

Si sustituyo Foo con FooImpl el código es aceptado.

¿Cuál es la razón de este comportamiento?

tipos de miembro

Respuesta

7

If I replace Foo with FooImpl the code is accepted.

Estaría muy sorprendido si esto compilado, a menos que FooImpl sea una enumeración.

miembros de anotación solamente pueden contener lo siguiente:

  • tipo primitivo
  • de Cuerda
  • Clase literal
  • anotación
  • artículo enum
  • o 1-dimensionales arrays de cualquiera de los arriba

It is a compile-time error if the return type of a method declared in an annotation type is any type other than one of the following: one of the primitive types, String, Class and any invocation of Class, an enum type (§8.9), an annotation type, or an array (§10) of one of the preceding types. It is also a compile-time error if any method declared in an annotation type has a signature that is override-equivalent to that of any public or protected method declared in class Object or in the interface annotation.Annotation.

Fuente: JLS

3

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7

la anotación deben ser uno de: primitivo, String, Clase, una enumeración, una matriz de cualquiera de los anteriores

Es un error de tiempo de compilación si el tipo de elemento es no acorde con ElementValue.

Espero que esto ayude!

encontró la misma en esta documentación, así:

http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.html

"retorno tipos están restringidos a primitivos, cuerdas, clase, enumeraciones, anotaciones y las matrices de los tipos anteriores." Como se menciona "interfaz" no está permitido.

+0

que se cumpliese la primera frase, la segunda parece ser el problema. Me pregunto por qué esto no está permitido en las anotaciones ... – soc

+3

@soc * Cumplo la primera oración * No, no. 'Clase fooType() 'sería válido,' Foo foo() 'no lo es. –

+0

considere Foo Foo() como un método (solo por el bien de la simplicidad) ... ¿podemos mencionar la interfaz como tipo de retorno para un método? :) – Nik

Cuestiones relacionadas