使用@Target设置为TYPE的注释

时间:2014-03-20 07:13:44

标签: java annotations

我试图找出将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的目标类型是有用的 这也可能会让我回答错误。

2 个答案:

答案 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_PARAMETERTYPE_USE。我想,这就是你的想法。

答案 1 :(得分:0)

给定的定义

@Target({ ElementType.TYPE })
@interface A1 {
}

创建一个声明注释,只能放在声明上(特别是在类,接口或枚举的定义上)。

要创建可以放置在类型的任何使用上的类型注释(而不是仅对类型的定义),请将TYPE更改为TYPE_USE:

@Target({ ElementType.TYPE_USE })
@interface A1 {
}