编辑:一如既往,在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");
}
}
Run Code Online (Sandbox Code Playgroud)
输出是 equal double,这对我没有意义.我期待 equal Float.如果我注释掉第二个printIt,那确实是输出.我只是不知道为什么,当面对两个printIt之间的选择时,编译器忽略了其参数完全匹配的那个.
你得到的结果是因为装箱/拆箱是在Java生命的后期添加的,并且要求预先存在的代码不能通过添加功能来改变.因此,当您将原始float传递给printIt时,它会被强制转换为原始double,因为替代方法意味着旧的(JDK1.4之前的)代码将采取不同的行为,这对Sun来说是不可接受的.
基本上,想想如果这是JDK1.4之前的代码,其中拳击不是替代,那么原始的双重无法被强制转换为java.lang.Float.不能允许添加拳击打破.
从你如何说出来的问题来看我发现的问题你可能看不到Float和float之间的区别,因为你指的是从大写F到小写F的变化作为一个微小的变化,当它真的不是那么微小的时候.小写版本引用原始数字类型,大写版本引用包装原始数字类型的对象,以允许数字内容用于集合等通用事物.在JDK1.4之前,如果你想做这样的事情,你必须手动写一行像
myList.add(new Float(1.0F));
Run Code Online (Sandbox Code Playgroud)
如果要将浮点值添加到列表中.在JDK1.4中添加装箱/拆箱试图用这个来解决这个问题并让编译器为我们做这件事,但不幸的是你仍然需要理解两者之间的区别来理解发生了什么.