@TypeQualifierDefault

@TypeQualifierDefault:
This qualifier is applied to an annotation to denote that the annotation defines a default type qualifier that is visible within the scope of the element it is applied to.

@Documented
@Target(value=ANNOTATION_TYPE)
@Retention(value=RUNTIME)
public @interface TypeQualifierDefault

@TypeQualifierDefault 用于标注注解,它有一个或多个ElementType参数:

  • ElementType.METHOD 用于方法的返回值;
  • ElementType.PARAMETER 用于值参数;
  • ElementType.FIELD 用于字段;以及
  • ElementType.TYPE_USE(自 1.1.60 起)适用于任何类型,包括类型参数、类型参数的上界与通配符类型。

@TypeQualifierDefault 一般和 @Nonnull 一起使用来标注一个注解,例如:

@Nonnull
@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER})
public @interface NonNullApi {
}

@Nonnull(when = When.MAYBE)
@TypeQualifierDefault({ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE_USE})
public @interface NullableApi {
}

@NullableApi
interface A {
    String foo(String x); // 可空性由接口A 的注解@NullableApi决定,fun foo(x: String?): String?

    @NotNullApi // 覆盖了接口A的@NullableApi, overriding default from the interface
    String bar(String x, @Nullable String y); // fun bar(x: String, y: String?): String 

    // The List type argument is seen as nullable because of `@NullableApi`
    // having the `TYPE_USE` element type: 
    String baz(List x); // fun baz(List?): String?

    // The type of `x` parameter remains platform because there's an explicit
    // UNKNOWN-marked nullability annotation:
    String qux(@Nonnull(when = When.UNKNOWN) String x); // fun baz(x: String!): String?
}

如果一个类型被@TypeQualifierDefault标注的注解所注解,比如上面的 接口 A@NullableApi 标注,那么如果接口A 的成员(变量或者方法)如果没有被其他可空性注解直接标注,那么A的成员的可空性由@NullableApi 决定,如果成员被其他可空性注解修饰了那就相当于覆盖掉了@NullableApiA 的成员可空性是否由@NullableApi决定,还有一个前提就是 @NullableApi@TypeQualifierDefaultElementType的参数类必须和成员类型一致,比如参数为ElementType.METHOD,那么A的成员就只有方法的可空性由@NullableApi 决定,其他类似,ElementType 参数可以为多个。 被@TypeQualifierDefault标注的注解所注解除了用于标注类,接口,字段,方法,参数等外 还可以标注包名,如果用来标注报名,那么这个包下的所有东西都默认情况下(没有被其他可空性标注或者覆盖)可空性都由标注包的注解来决定。


@Nonnull注解和When一起使用:

  • When.ALWAYS – 类型始终不为空,没有明确指定地默认使用该值(在kotlin中被视为kotlin不可为空类型)
  • When.MAYBE/NEVER – 类型可能为空(在kotlin中被视为kotlin可能为空类型)
  • When.UNKNOWN – 类型在kotlin中被视为平台类型

你可能感兴趣的:(Annotation)