编辑:一如既往,在5分钟内得到很好的答案:)如果我做了一个微小的改变 - 让F大都“浮动”,我会得到我预期的输出。
class NumberMachine{
public static void main(String [] args) {
Integer wi1 = new Integer("420");
int i = 101;
Integer wi2 = i*420/101;
if(wi1 == wi2) System.out.print(" ==");
if(wi1.equals(wi2)) System.out.print(" equal");
float f = 1.23f; //if this were Float f..., it'd print Float, not double.
new NumberMachine().printIt(f);
}
void printIt(Float f){
System.out.println(" Float");
}
void printIt(double d){
System.out.println(" double");
}
}
输出为equal double
,这对我没有意义。我期待equal Float
。如果我注释掉第二个printIt,那确实是输出。我只是不知道为什么,当面对两个printIt之间的选择时,编译器忽略了其参数完全匹配的那个。
答案 0 :(得分:7)
你得到的结果是因为装箱/拆箱是在Java生命的后期添加的,并且要求预先存在的代码不能通过添加功能来改变。因此,当您将原始float传递给printIt时,它会被强制转换为原始double,因为替代方法意味着旧的(JDK1.4之前的)代码将采取不同的行为,这对Sun来说是不可接受的。
基本上,想想如果这是JDK1.4之前的代码,其中拳击不是替代方案,那么原始的双重无法被强制转换为java.lang.Float。不能允许添加拳击打破它。
从你如何说出来的问题中读到你的问题你可能看不到Float和float之间的区别,因为你指的是从大写F到小写F的变化作为一个微小的变化,当它真的不是这样的时候小。小写版本引用原始数字类型,大写版本引用包装原始数字类型的对象,以允许数字内容用于集合等通用事物。在JDK1.4之前,如果你想做这样的事情,你必须手动写一行像
myList.add(new Float(1.0F));
如果要将浮点值添加到列表中。在JDK1.4中添加装箱/拆箱试图在此基础上编写并让编译器为我们执行此操作,但不幸的是,您仍然需要了解两者之间的区别,以了解正在发生的事情。