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"); 
  } 
} 

結果が「等しいダブル」であるのに「等しいフロート」ではないのはなぜですか?

4

3 に答える 3

11

JLS #5.3およびJLS #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(float to double) はボクシングに勝るから

于 2012-07-24T10:50:17.323 に答える
0

printIt(Float f) は Float オブジェクトを受け入れますが、printIt(double d) はプリミティブ型 double を受け入れます。

したがって、2 番目の 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 に答える