我有以下方法:
public void myMethod (@Nullable int number) {
if (number == null) {
}
}
导致编译器错误,表示无法比较null
和int
。但number
标有@Nullable
属性!这意味着可以为空,对吧?
当我尝试用null
调用方法时,编译器错误再次出现。如果是这种情况,为什么我可以在第一个位置标记int nullable?
我只是想问为什么我可以标记int
可空,但我不能将其设置为空。
答案 0 :(得分:3)
将int更改为Integer Null只能分配给Objects而不能分配给原始类型 使用int的包装类,即Integer。
在你的情况下,数字不应该是可空的,因为它的基本类型和null永远不能分配给基本类型。
答案 1 :(得分:1)
@Nullable
是一个注释。注释只是元数据。你需要一些外在的东西来使它变得有用。您可以使用注释做的最多的事情是指定它们可以注释的内容。这是通过@Target
和各种ElementType
枚举常量提供的。
其中,是PARAMETER
(默认是所有内容都可以注释)。 PARAMETER
允许您注释方法参数。如果您只将PARAMETER
设置为@Target
,那么如果您尝试在其他任何位置使用注释,编译器将会出错。这是编译器可以自己提供的最多(YMMV用于某些内置注释类型)。
在所有其他情况下,您需要构建一些将在编译时或运行时处理注释的内容。在这种情况下,用@Nullable
注释该参数是完全没有意义的。
显然,int
是一种原始类型。 null
是null类型的唯一值,可以为引用类型赋值(或可以转换)。无法将基元与引用类型进行比较(通过装箱/拆箱操作除外)。
所以
someIntValue == null
是可以在编译时验证语法不正确的东西。此
@Nullable int number
不能。它只是一个参数注释。
答案 2 :(得分:1)
Primitive data types不能是null
。您可以为对象分配null
值,但不能为基元分配值;将其更改为Integer
,其中包含对象中基元类型int
的值。
答案 3 :(得分:0)
此注释通常用于消除NullPointerExceptions
。 @Nullable
经常表示此参数可能为null。
另见https://github.com/google/guice/wiki/UseNullable(Google Guice)
在这个轻量级依赖注入框架中,您可以告诉该依赖项可能为null。如果您尝试传递null并且没有注释,框架将拒绝执行它的工作。
参考:https://www.jetbrains.com/idea/help/nullable-and-notnull-annotations.html
答案 4 :(得分:0)
@Nullable是一个类型注释,如果你检查@Nullable(https://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/Nullable.java?r=24)和@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是一种原始类型。预计在编译时会进行强类型检查