@TypeQualifierDefault

本文详细介绍了Java中的@TypeQualifierDefault注解的使用方法及原理,包括如何与@Nonnull配合使用来定义默认的类型限定符,并解释了这些注解如何应用于方法、参数、字段和类型使用场景。

@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<String> type argument is seen as nullable because of `@NullableApi`
    // having the `TYPE_USE` element type: 
    String baz(List<String> x); // fun baz(List<String?>?): 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中被视为平台类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮克桃在写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值