由注释限定的有界类型参数

时间:2015-02-06 23:00:19

标签: java generics annotations

在Java中,可以使bounder类型参数必须从特定的类或接口扩展,例如

public class Box<T extends MyClass> {
    T t
    ...
}

我是否可以通过注释绑定,以便T的值只能是具有特定注释的类?

2 个答案:

答案 0 :(得分:3)

从Java 8开始,您可以编写

public class Box<T extends @MyAnno MyClass> {
...
}

与任何Java注释一样,要强制执行语义,您需要使用注释处理器。 Checker Framework是一个为您强制执行语义的注释处理工具:如果您尝试使用缺少{{1的类型参数来实例化Box类型,则可以将其配置为发出错误注释。

答案 1 :(得分:1)

不幸的是,没有办法在java AFAIK中表达它。 <T annotatedWith MyAnnotation>在某些情况下会非常方便,但它会添加一个新的关键字,老实说,仿制药很难;)

否则对于注释,因为@duckstep说在运行时很容易用

检查
t.getClass().isAnnotationPresent(annotationClass)

对于注释处理器,API要处理起来要困难得多。这是一些代码,如果它可以帮助一些人:

private boolean isAnnotationPresent(TypeElement annotationTypeElement, String annotationName) {
    for (AnnotationMirror annotationOfAnnotationTypeMirror : annotationTypeElement.getAnnotationMirrors()) {
        TypeElement annotationOfAnnotationTypeElement = (TypeElement) annotationOfAnnotationTypeMirror.getAnnotationType().asElement();
        if (isSameType(annotationOfAnnotationTypeElement, annotationName)) {
            return true;
        }
    }
    return false;
}

private boolean isSameType(TypeElement annotationTypeElement, String annotationTypeName) {
    return typeUtils.isSameType(annotationTypeElement.asType(), elementUtils.getTypeElement(annotationTypeName).asType());
}