Java 如何将NNEL(除局部变量外非Null)声明为具有Checker框架的API的默认值

Java 如何将NNEL(除局部变量外非Null)声明为具有Checker框架的API的默认值,java,checker-framework,Java,Checker Framework,过去的手册和Stackoverflow回答说,NNEL是Checker框架中的默认值。然而,最近的手册(3.7.1)不再提及该术语 我在一个包裹上试过: @DefaultQualifier(value = NonNull.class, locations = {TypeUseLocation.RETURN, TypeUseLocation.PARAMETER, TypeUseLocation.FIELD, TypeUseLocation.UPPER_BOUND}) 但是,我不能宣布

过去的手册和Stackoverflow回答说,NNEL是Checker框架中的默认值。然而,最近的手册(3.7.1)不再提及该术语

我在一个包裹上试过:

  @DefaultQualifier(value = NonNull.class,
    locations = {TypeUseLocation.RETURN, TypeUseLocation.PARAMETER, TypeUseLocation.FIELD, TypeUseLocation.UPPER_BOUND})
但是,我不能宣布这是可行的:

public interface EntryProcessor<K, V, @Nullable R> { }
问题:

  • 现在的默认值是什么
  • NNEL概念是否包括类型参数
  • 如何以尽可能最短的形式为包或Java模块(
    module info.Java
    )建立NNEL
  • 如果NEEL不包括类型参数,如何建立默认值
    EntryProcessor
    的意思是有效地
    EntryProcessor
有一个关于默认设置的手册部分。 该节说:

例如,空值检查器的默认限定符是
@NonNull
。当用户写入非限定类型(如
日期
)时,空值检查器将其解释为
@非空日期

类型系统将该默认限定符应用于大多数但不是所有类型使用。特别是,除非另有说明,否则每种类型的系统都使用爬升到顶部规则。此规则规定,层次结构中的顶级限定符是爬升位置的默认值:CAST、Locals和(部分)ImplicitBOUND

这类似于旧的“除局部变量外的非null”描述,但更精确地说明了这一点,并回答了您关于类型参数的问题

我如何建立默认值,以便
EntryProcessor
有效地表示
EntryProcessor

绑定的
扩展对象是隐式的,因此根据上面提到的爬升到顶部规则,它默认为顶部。(对于空值检查器,顶部为
@Nullable
)。此选项对于

在源代码中,您可以编写
@NonNull K
K extends Object
,或
K extends@NonNull Object

如果要更改默认值,则您提供的代码是正确的:

@DefaultQualifier(value=NonNull.class,
locations={TypeUseLocation.RETURN,TypeUseLocation.PARAMETER,TypeUseLocation.FIELD,TypeUseLocation.UPPER\u BOUND})


除了
上限
,在
类型使用位置
枚举中还有一个值。您选择不包含它有什么原因吗?

非常感谢您的快速回答!我没有使用隐式上界,因为非空假设也应该是显式上界的默认值。我是否需要同时指定两者?那么上界是什么意思?我不明白其中的道理<代码>后者将禁止C之类的实例化,或者需要重写代码
。假设现在是默认值,
Date
意味着
@NonNull Date
也需要重写代码。据我所知,整个检查都是关于重写代码的,因为我们希望对其进行改进:)我尝试了隐式上界,但对于完全相同的错误消息也不起作用。您没有回答“最短形式”部分。我将提出另一个问题,更好地说明这一点。
java: [bound.type.incompatible] incompatible bounds in type parameter
  type: R extends @Initialized @NonNull Object
  upper bound: @Initialized @NonNull Object
  lower bound: @Initialized @Nullable null