Eclipse 中数组的可为空性

use*_*051 7 java

建议在 Eclipse 4.30 中使用以下代码:

    public void doSomething(@NonNull SomeType[] pArray) {
       // Whatever
    }
Run Code Online (Sandbox Code Playgroud)

如果我启用可空性检查(首选项/Java 编译器/“错误/警告”/空分析/启用基于注释的空分析),那么我会注意到以下内容:

编译器将参数类型视为“SomeType 元素的数组,所有元素均非空”,或者换句话说,@NonNull SomeType 的数组。(如果你不相信我,将 SomeType 更改为 byte,并注意错误消息,因为 byte 是原始类型,所以 @NonNull byte 没有任何意义。)

这一切都很好。但是,我想告诉编译器,数组本身是非空的。有没有可能表达这一点?(假设@NonNull (SomeType[]) pArray。)

谢谢!

rzw*_*oot 5

当然,当然。这个故事有两层无效性。事实上,比如说 an Object[][],有3 种不同的无效性。

它可以是对数组的可为空引用,该数组包含绝对不为空对象的绝对不为空数组。

它可以是对数组的绝对非空引用,其中包含对绝对非空对象数组的可为空引用。

等等。

每个级别指定的语法如下:

@Nullable String @NonNull [] x
Run Code Online (Sandbox Code Playgroud)

这意味着:对可为空字符串数组的绝对非空引用。

每个都[]可以添加注释作为前缀,应用于该“层”。

同样的“3 层”情况也适用于对象列表的列表,但语法在那里更加明显:

@NonNull List<@Nullable String>
Run Code Online (Sandbox Code Playgroud)

是等价的。

重要警告:这需要将注释标记为适用于TYPE_USE。许多无效注释是在 java 1.5 时代创建的,但没有TYPE_USE; 只有PARAMETER和。METHODFIELD因此,许多无效注释仍然只针对 P/M/F 而不是 T_U。对于这些,你想要的根本不可能。更新到更好的无效注释系统,或接受它们的工作方式。

一些主要的注释库基于TYPE_USE