【问题标题】:Autoboxing rules自动装箱规则
【发布时间】:2019-02-06 00:07:18
【问题描述】:

为什么在方法中会发生自动装箱

public static int compareAges(Person p1, Person p2) {
    return ((Integer) p1.getAge()).compareTo(p2.getAge());
}

但是我们在方法中得到一个编译器错误

public static int compareAges(Person p1, Person p2) {
    return p1.getAge().compareTo(p2.getAge());
}

?


根据 Javadocs:

自动装箱是 Java 编译器在基本类型与其对应的对象包装类之间进行的自动转换。

那么,换句话说,为什么编译器不能在第二种方法中执行自动装箱呢?是不是因为在第二种方法中,绑定不是显式的,而在第一种方法中绑定是明确的。

【问题讨论】:

  • 这里的答案stackoverflow.com/questions/19017258/… 很好读。
  • @nullpointer 这与绑定无关。 Java 只是选择不支持这种语法。发现了将近 10 年前的重复内容stackoverflow.com/questions/4242/…
  • @Oleg 甚至我都在深入研究以想出类似的东西。我猜Integer.compare(a,b) 应该有效地用于此类事件。
  • @nullpointer, Oleg:我觉得除了选择不支持它之外,还有更强有力的理由。然而,这就是无处不在的答案。
  • @nullpointer 可能只是 James Gosling 没有发现有用的另一件事,所以当然这意味着没有其他人可以使用它(比如运算符重载)。

标签: java autoboxing


【解决方案1】:

当您在原语上调用方法时,Java 选择不支持自动装箱,这可能是因为 James Gosling 自己永远不会做这样的事情,所以这当然意味着其他开发人员永远不需要它。

如果您没有得到参考检查this answer

因为詹姆斯·高斯林是这么说的:

我忽略了运算符重载作为一个相当个人的选择,因为我看到太多人在 C++ 中滥用它。

詹姆斯·高斯林。来源:http://www.gotw.ca/publications/c_family_interview.htm

【讨论】:

    【解决方案2】:

    在关于自动装箱的 JavaDoc 中 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

    将原始值(例如 int)转换为 相应的包装类(整数)称为自动装箱。这 Java 编译器在原始值为以下时应用自动装箱:

    • 作为参数传递给需要相应包装类的对象的方法。

    • 赋值给对应包装类的变量。

    在第二种方法中,自动装箱不会发生。

    【讨论】:

    • 该文档确实说明了您所引用的内容。我知道自动装箱不会在第二种方法中发生。它背后的“为什么”正是我的问题。
    • 因为目前Java只支持两种情况下的自动装箱(赋值&作为参数传递)。在您的情况下,调用 Integer 方法(变量为 int),Java 现在不支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多