Anotações extensíveis aumentariam efetivamente o ônus de especificar e manter outro sistema de tipos. E esse seria um sistema de tipos bastante exclusivo, portanto você não poderia simplesmente aplicar um paradigma de tipo OO.
Pense em todos os problemas ao introduzir polimorfismo e herança em uma anotação (por exemplo, o que acontece quando a sub-anotação altera as especificações da meta-anotação, como retenção?)
E tudo isso adicionou complexidade para qual caso de uso?
Deseja saber se uma determinada anotação pertence a uma categoria?
Tente o seguinte:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Como você pode ver, você pode agrupar e categorizar anotações com facilidade, sem problemas desnecessários, usando os recursos fornecidos.
Portanto, o KISS é a razão para não introduzir um sistema do tipo meta-tipo na linguagem Java.
[ps editar]
Eu usei o String simplesmente para demonstração e em vista de uma meta-anotação aberta. Para o seu próprio projeto, obviamente, você pode usar uma enumeração de tipos de categoria e especificar várias categorias ("herança múltipla") para uma determinada anotação. Observe que os valores são totalmente falsos e apenas para fins de demonstração:
@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
, ou seja, qualquer anotaçãoinstanceof
, embora esse fato não seja explicitamente declarado.