我不是习惯将原始数据类型转换为对象。看到一些代码,例如:
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。