检查可为空的 int 会导致问题

Checking a nullable int causes problems

我有以下方法:

public void myMethod (@Nullable int number) {
    if (number == null) {

    }
}

导致编译错误,说nullint不能比较。但是 number 被标记为 @Nullable 属性!这意味着它 可以 为空,对吧?

当我尝试用 null 调用方法时,编译器再次出错。如果是这样,为什么我可以首先将 int 标记为 nullable?

我只想问为什么我可以将一个 int 标记为 nullable 但我不能将其设置为 null。

将整数更改为整数。
Null 只能分配给对象,不能分配给原始类型。
使用 int 的包装器 class 即 Integer.

在你的情况下,number 应该是不可空的,因为它是原始类型,而 null 永远不能分配给原始类型。

@Nullable 是注释。注释只是元数据。你需要一些外部的东西来让它变得有用。您最多可以使用注释来指定它们可以注释的内容。这是通过 @Target 和各种 ElementType 枚举常量提供的。

其中,是PARAMETER(默认是一切都可以注释)。 PARAMETER 允许您注释方法参数。如果您只将 PARAMETER 设置为 @Target,那么如果您尝试在其他任何地方使用注释,编译器将出错。这是编译器自己可以给你的最多的(YMMV 对于一些内置的注释类型)。

在所有其他情况下,您需要构建一些东西来处理注释,无论是在编译时还是在运行时。在这种情况下,用 @Nullable 注释该参数是完全没有意义的。

显然,int 是原始类型。 null 是 null 类型的唯一值,可分配(或强制转换)给引用类型。基元不能与引用类型进行比较(通过 boxing/unboxing 操作除外)。

所以

someIntValue == null

是可以在编译时验证语法错误的东西。这个

@Nullable int number

不能。只是一个参数注解。

Primitive data types cannot be null. You can assign a null value to an object, but not to primitives; change it to Integer 将原始类型 int 的值包装在对象中。

这个注解常用来消去NullPointerExceptions@Nullable 经常说这个参数可能为空。

另请参阅 https://github.com/google/guice/wiki/UseNullable(Google Guice)

在这个轻量级依赖注入框架中,你告诉这个依赖可能是空的。如果您尝试传递 null 并且没有注释,框架将拒绝执行它的工作。

参考:https://www.jetbrains.com/idea/help/nullable-and-notnull-annotations.html

@Nullable 是一种类型注释,如果您检查 @Nullable(https://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/Nullable.java?r=24) and @NonNull(http://grepcode.com/file/repo1.maven.org/maven2/com.google.gwt/gwt-dev/2.5.1/javax/annotation/Nonnull.java)

的来源

@NonNull 在@Nullable 中使用,并且在@NonNull 代码中有一个检查 null 的条件,如下所示:

if (value == null)
     return When.NEVER; 

所以这里可能会抛出异常,因为 int 是原始类型。这有望在编译时进行强类型检查