我不是习惯将原始数据类型转换为对象。看到一些代码,例如:

public static int CompareAges(Person p1, Person p2) {
    Integer age1 = p1.getAge();
    return age1.compareTo(p2.getAge());
}
age1的实例化似乎是多余的,因此我尝试将代码编写为:
public static int CompareAges(Person p1, Person p2) {
    return p1.getAge().compareTo(p2.getAge());
}

但这引起了编译器错误,因为p1.getAge()是原始数据类型int而不是Integer(它是一个对象)。

凭直觉,我做到了:
public static int CompareAges(Person p1, Person p2) {
    return ((Integer) p1.getAge()).compareTo(p2.getAge());
}

而且有效!

问题:我想念什么?从什么时候开始将转换为值类型的图元?

最佳答案

这是内部发生的情况:

1. Integer age1 = p1.getAge();
       Integer != int
       Integer = Integer.valueOf(int)
   Integer age1 = Integer.valueOf(p1.getAge());

2. p1.getAge().compareTo(p2.getAge());
       int.compareTo(int)
       ^^^
       // it's just a primitive type, as a result - the compile error

3. ((Integer) p1.getAge()).compareTo(p2.getAge())
       Integer.compareTo(int)
       Integer.compareTo(Integer.valueOf(int))
   ((Integer) p1.getAge()).compareTo(Integer.valueOf(p2.getAge()))

4. (Integer) p1.getAge() ---> Integer.valueOf(p1.getAge())
       // why so? look at callOfCode's answer

但是,我认为((Integer) p1.getAge()).compareTo(p2.getAge())看起来很丑。

我将其替换为
p1.getAge() > p2.getAge() ? 1 : (p1.getAge() < p2.getAge() ? -1 : 0)

或者
Integer.compare(p1.getAge(), p2.getAge()) // java 7+

在这种情况下,我不想进行投射。

有关“自动装箱/拆箱”的更多信息,您可以找到here

07-24 18:36