在Java中,可以使bounder类型参数必须从特定的类或接口扩展,例如
public class Box<T extends MyClass> {
T t
...
}
我是否可以通过注释绑定,以便T的值只能是具有特定注释的类?
答案 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());
}