浮球是怎么变成双人的?

Bad*_*est 4 java numbers

编辑:一如既往,在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之间的选择时,编译器忽略了其参数完全匹配的那个.

Nat*_*hes 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));
Run Code Online (Sandbox Code Playgroud)

如果要将浮点值添加到列表中.在JDK1.4中添加装箱/拆箱试图用这个来解决这个问题并让编译器为我们做这件事,但不幸的是你仍然需要理解两者之间的区别来理解发生了什么.

  • 很好的答案.我只想补充一点,如果你让两个printIt方法采用包装类型(将printIt(double d)更改为printIt(Double d))或者使两者都采用原始类型(float和double,而不是Float和Double),那么你期望会发生什么.在泛型之外使用Float和Double通常是一个错误. (2认同)