Java 如何将NNEL(除局部变量外非Null)声明为具有Checker框架的API的默认值
过去的手册和Stackoverflow回答说,NNEL是Checker框架中的默认值。然而,最近的手册(3.7.1)不再提及该术语 我在一个包裹上试过: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}) 但是,我不能宣布
@DefaultQualifier(value = NonNull.class,
locations = {TypeUseLocation.RETURN, TypeUseLocation.PARAMETER, TypeUseLocation.FIELD, TypeUseLocation.UPPER_BOUND})
但是,我不能宣布这是可行的:
public interface EntryProcessor<K, V, @Nullable R> { }
问题:
- 现在的默认值是什么
- NNEL概念是否包括类型参数
- 如何以尽可能最短的形式为包或Java模块(
)建立NNELmodule info.Java
- 如果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