1. Set<Long> values = ...
if(values.contains(42)) 会出现问题
即使我们明确地声明希望在两种不同的情况下分别获得Double和Integer的0值,结果却始终返回的是Double类型的0值。这是因为根据JLS#15.25,不同的数值类型间的运算首先会经过双目类型提升(Binary Numeric Promotion)将不同类型的数值转化为同一类型后再进行计算。因此上述的运算实际上与下面的运算是等同的:
Object getZeroOnCondition(boolean flag) {
return Double.valueOf(
flag ?
Double.valueOf(0).doubleValue() :
(double) Integer.valueOf(0).intValue());
}
如果想要在两种不同的情况下获得不同类型的0值,可以直接显式地将数值类型转换为非数值类型,或者使用分支语句。
正例
// 显式地将数值类型转换为非数值类型
Object getZeroOnConditionWithCast(boolean flag) {
return flag ?
(Object) Double.valueOf(0) :
(Object) Integer.valueOf(0);
}
// 或者使用分支语句
Object getZeroOnConditionWithBranch(boolean flag) {
if (flag) {
return Double.valueOf(0);
} else {
return Integer.valueOf(0);
}
}
反例
Object getZeroOnCondition(boolean flag) {
return flag ?
Double.valueOf(0) :
Integer.valueOf(0);
}