我有以下方法:
public void myMethod (@Nullable int number) {
if (number == null) {
}
}
导致编译错误,认为null
和int
不能比较。但是number
被标记为@Nullable
属性!这意味着可以为空,对吧?
当我尝试用null
调用方法时,编译器再次错误。如果是这种情况,为什么我可以在一开始就将int标记为空呢?
我只是想问为什么我可以标记int
为空,但我不能将其设置为空
将整型改为整型
Null只能赋值给object,不能赋值给基本类型。
使用int的包装类,即Integer。
在这种情况下,number不应该为空,因为它是一个基本类型,而null永远不能被赋值给基本类型。
原始数据类型不能为null
。你可以将null
值赋给对象,但不能赋给原语;将其更改为Integer
,将原始类型int
的值包装在对象中。
@Nullable
为注释。注释只是元数据。你需要一些外部的东西来使它有用。对于注释,你最多能做的就是指定它们能注释什么。这是通过@Target
和各种ElementType
枚举常量提供的。
是PARAMETER
(默认是所有内容都可以注释)。PARAMETER
允许您注释方法参数。如果您只将PARAMETER
设置为@Target
,那么如果您试图在其他地方使用注释,编译器将会出错。这是编译器自己能给你的最多的(对于一些内置的注释类型来说是YMMV)。
在其他情况下,您需要构建一些东西来处理注释,无论是在编译时还是在运行时。在本例中,用@Nullable
注释该参数是完全没有意义的。
显然,int
是一个基本类型。null
是null类型唯一可赋值(或可以强制转换)给引用类型的值。不能将原语与引用类型进行比较(除非通过装箱/拆箱操作)。
someIntValue == null
是可以在编译时验证语法错误的东西。这个
@Nullable int number
不能。它只是一个参数注释
此注释通常用于消除NullPointerExceptions
。@Nullable
通常说该参数可能为null。
参见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)和@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是基本类型。这将在编译时进行强类型检查