代码之家  ›  专栏  ›  技术社区  ›  Bad Request

浮球是怎么变成双打的?

  •  4
  • Bad Request  · 技术社区  · 14 年前

    编辑:和往常一样,在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 . 如果我对第二个printint进行注释,那么这确实是输出。我只是不知道为什么当面对两个printit之间的选择时,编译器忽略了参数完全匹配的那个。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Nathan Hughes    14 年前

    您得到的结果是因为在Java生命周期中添加了装箱/取消装箱,因此需要通过添加特征来改变预先存在的代码。因此,当您传入一个原语float以打印它时,它会被强制为原语double,因为这个选项意味着旧的(pre-jdk1.4)代码的行为会有所不同,这对于Sun来说是不可接受的可能性。

    基本上,假设这是JDK1.4之前的代码,其中装箱不是一种选择,那么就无法将原语double强制为java.lang.float。不允许添加拳击来打破这一点。

    读到这个问题,我想到了你怎么说,你可能看不到浮动和浮动的区别,因为你把从大写字母F到小写字母F的变化称为一个微小的变化,当它真的不是那么微小的时候。小写版本指的是基元数字类型,大写版本指的是包装基元数字类型的对象,以便在集合等一般用途中使用数字内容。在JDK1.4之前,如果你想做这样的事情,你必须手动写一行

    myList.add(new Float(1.0F));
    

    如果要向列表中添加浮点值。JDK1.4中添加了装箱/拆箱功能,试图将其改写,并让编译器为我们完成这项工作,但不幸的是,您仍然需要理解这两者之间的区别,才能理解正在发生的事情。