Las anotaciones extensibles agregarían efectivamente la carga de especificar y mantener otro sistema de tipos. Y este sería un sistema de tipos bastante único, por lo que no podría simplemente aplicar un paradigma de tipo OO.
Piense detenidamente en todos los problemas cuando introduzca el polimorfismo y la herencia en una anotación (por ejemplo, ¿qué sucede cuando la subanotación cambia las especificaciones de la metaanotación como la retención?)
¿Y toda esta complejidad añadida para qué caso de uso?
¿Quiere saber si una anotación dada pertenece a una categoría?
Prueba esto:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Como puede ver, puede agrupar y clasificar fácilmente las anotaciones sin dolor excesivo utilizando las facilidades proporcionadas.
Entonces, KISS es la razón para no introducir un sistema de tipo meta-tipo en el lenguaje Java.
[ps editar]
Utilicé la cadena simplemente para demostración y en vista de una anotación meta abierta. Para su propio proyecto dado, obviamente puede usar una enumeración de tipos de categoría y especificar múltiples categorías ("herencia múltiple") para una anotación dada. Tenga en cuenta que los valores son completamente falsos y solo con fines de demostración:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
AnnotationCategory[] category();
}
public enum AnnotationCategory {
GENERAL,
SEMANTICS,
VALIDATION,
ETC
}
@Category(category={AnnotationCategory.GENERAL, AnnotationCategory.SEMANTICS})
public @interface FooBarAnnotation {
}
java.lang.annotation.Annotation
, es decir, cualquier anotación lo esinstanceof
, aunque este hecho no se declara explícitamente.