为什么Java编译器有时允许空的拆箱?(Why does the Java compiler som

2019-07-30 22:11发布

例如:

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的不是失败,相同的错误编译两种情况?

Answer 1:

在第一种情况下,编译器知道你要拆箱编译时间常数的null

在第二种情况下,条件表达式的类型是Integer ,所以你写有效:

Integer tmp = new Random().nextBoolean() ? 1 : null;
return (int) tmp;

......所以,拆箱是不会发生在一个常量表达式,编译器将允许它。

如果你改变了它迫使条件表达式为类型int由拆箱那里 ,它会失败:

// Compile-time failure
return new Random().nextBoolean() ? 1 : (int) null;


Answer 2:

拳击部分隐藏基元和相应的包装对象之间的区别,但它不删除它。

有未通过拳击改变了两个区别:

  • 对象可以是零,而原语不能
  • 对象具有两个状态和身份,而原语仅具有状态(值)

偶尔,用拳时,这些差异可能会导致问题。

要记住的几点:

  • 小心空。 自动拆箱空对象将导致NullPointerException
  • 与比较项目==equals必须特别小心。


Answer 3:

您不能将空为int

    int anInt = null;

Java允许这一点,因为你没有为int分配空

    System.out.println("" + getSomeVal()); //null was just converted to a srting and was printed

如果执行此,你可以得到错误

    int anInt = getSomeVal();


文章来源: Why does the Java compiler sometimes allow the unboxing of null?