3

我有这个代码。

 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; 
     new NumberMachine().printIt(f); 
  } 

  void printIt(Float f) { 
    System.out.println(" Float"); 
  } 

  void printIt(double d) { 
    System.out.println(" double"); 
  } 
} 

为什么结果是 "equal double" 但没有 "equal Float" ?

4

3 回答 3

11

为了确定应该调用哪个方法,编译器会检查以下列表,如JLS #5.3JLS #15.12.2中所述:

  • 身份转换(§5.1.1)
  • 扩大的原始转换(§5.1.2)==>printIt(double)在这里工作
  • 扩大参考转换(§5.1.5)
  • 一个装箱转换(第 5.1.7 节)可选地后跟扩大参考转换 ==>printIt(Float)如果没有printIt(double)
  • 一个拆箱转换(第 5.1.8 节)可选地后跟一个扩大的原始转换。
于 2012-07-24T10:52:20.010 回答
2

因为widening(浮动到双倍)击败拳击

于 2012-07-24T10:50:17.323 回答
0

printIt(Float f) 接受 Float 对象,但 printIt(double d) 接受原始类型 double。

因此,调用第二个 printIt 函数时将 float 强制转换为 double。

请参阅http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Float.html

您可以像这样调用第一个函数:

Float f = new Float(5.0);
printIt(f);
于 2012-07-24T10:52:10.607 回答