我试图找出将TARGET设置为TYPE的用法。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Map;
@Retention(RetentionPolicy.SOURCE)
@Target({ ElementType.TYPE })
@interface A1 {
}
@A1
class Y {}
class X {
void foo() {
Map<@A1 Y, String> y1; // ERROR: The Annotation is disallowed at the
// location
}
}
oracle docs列表: ElementType.TYPE可以应用于类的任何元素。
这是否意味着它可以应用于类的字段。如果是这样的话,我可以 将@Target设置为@Target({ElementType.FIELD})。
为什么我需要ElementType.TYPE。
JSR 308列出
类型注释出现在类型的简单名称之前,如@NonNull String或java.lang。@ NonNull String。以下是示例:
for generic type arguments to parameterized classes:
Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;
所以问题是设置为ElementType.TYPE的目标类型是有用的 这也可能会让我回答错误。
答案 0 :(得分:0)
嗯...教程中的解释
ElementType.TYPE can be applied to any element of a class
确实是错的。我也理解短语“类的任何元素”,就像你可以将这个注释放在任何成员上一样。这是错误的。
这是ElementType.TYPE
的Javadoc评论:
Class, interface (including annotation type), or enum declaration
这是关于类型声明的。没有其他的。根据您提到的其他使用场景,看看Java 8(嘿,它已经出现了两天)。 ElementType
枚举现在知道另外两个常量:TYPE_PARAMETER
和TYPE_USE
。我想,这就是你的想法。
答案 1 :(得分:0)
给定的定义
@Target({ ElementType.TYPE })
@interface A1 {
}
创建一个声明注释,只能放在声明上(特别是在类,接口或枚举的定义上)。
要创建可以放置在类型的任何使用上的类型注释(而不是仅对类型的定义),请将TYPE更改为TYPE_USE:
@Target({ ElementType.TYPE_USE })
@interface A1 {
}