例如:
int anInt = null;
失败在编译时间,但
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("" + getSomeVal());
}
}
public static int getSomeVal() {
return new Random().nextBoolean() ? 1 : null;
}
失败(通常)在运行时。 试图返回只是null
也将导致编译错误,所以我认为有一些是关于具有使编译器推断,多路径null
是可能的autoboxed int
? 为什么javac的不是失败,相同的错误编译两种情况?
在第一种情况下,编译器知道你要拆箱编译时间常数的null
。
在第二种情况下,条件表达式的类型是Integer
,所以你写有效:
Integer tmp = new Random().nextBoolean() ? 1 : null;
return (int) tmp;
......所以,拆箱是不会发生在一个常量表达式,编译器将允许它。
如果你改变了它迫使条件表达式为类型int
由拆箱那里 ,它会失败:
// Compile-time failure
return new Random().nextBoolean() ? 1 : (int) null;
拳击部分隐藏基元和相应的包装对象之间的区别,但它不删除它。
有未通过拳击改变了两个区别:
- 对象可以是零,而原语不能
- 对象具有两个状态和身份,而原语仅具有状态(值)
偶尔,用拳时,这些差异可能会导致问题。
要记住的几点:
- 小心空。 自动拆箱空对象将导致
NullPointerException
。 - 与比较项目
==
和equals
必须特别小心。
您不能将空为int
int anInt = null;
Java允许这一点,因为你没有为int分配空
System.out.println("" + getSomeVal()); //null was just converted to a srting and was printed
如果执行此,你可以得到错误
int anInt = getSomeVal();