Java教程介绍了以下内容:
如果@Target元注释不存在于注释类型T上,那么类型T的注释可以作为除类型参数声明之外的任何声明的修饰符写入.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/annotation/Target.html
其他手册说,如果@Target不存在,则注释可以在除TYPE_使用或TYPE_参数场景之外的任何地方使用.
我不太确定在这种情况下"参数声明"是什么意思.这个类进行编译,注释"@EveryWhere"实际上无处不在,没有任何@Target注释.包括强制转换操作、lambda参数和泛型声明.
import java.util.ArrayList;
import java.util.function.Predicate;
@interface EveryWhere{}
public @EveryWhere class AnnotedEveryWhere<@EveryWhere T> extends @EveryWhere Object{
@EveryWhere int i = 0;
@EveryWhere <@EveryWhere T> String method(@EveryWhere ArrayList<@EveryWhere String> array) {
@EveryWhere Predicate<@EveryWhere ArrayList<@EveryWhere String>> pred =
(@EveryWhere ArrayList<@EveryWhere String> lambdaParameter)->{
@EveryWhere ArrayList<@EveryWhere String> insideLambda = new @EveryWhere ArrayList<@EveryWhere String>();
return (@EveryWhere boolean) true;};
return (@EveryWhere String) "String";
}
}