簡體   English   中英

浮子怎么變成雙子了?

[英]How did a float turn into a double here?

編輯:與往常一樣,在5分鍾內給出了一個很好的答案:)事實證明,如果我做一個微小的更改-將F大寫成“ float”,我將得到預期的輸出。

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 如果我注釋掉第二個printIt,那確實是輸出。 我只是不知道為什么,當面對兩個printIt之間的選擇時,編譯器會忽略參數完全匹配的那個。

之所以可以得到結果,是因為裝箱/拆箱是在Java的較晚時期添加的,並且要求不通過添加功能來更改預先存在的代碼。 因此,當您將原始浮點數傳遞給printIt時,它將被強制轉換為原始雙精度點,因為替代方法將意味着舊的(JDK1.4之前的)代碼將以不同的方式起作用,這對於Sun來說是不可接受的。

基本上,請考慮一下,如果這是JDK1.4之前的代碼,而裝箱不是一種選擇,那么根本不可能將原始的double強制轉換為java.lang.Float。 添加拳擊不能打破它。

從您的措辭上讀到它對我的問題,您可能看不到Float和float的區別,因為您將從大寫F到小寫F的更改稱為很小的更改,而實際上卻不是那么小。 小寫版本是指原始數字類型,大寫版本是指包裝原始數字類型的對象,以便允許將數字內容用於諸如集合之類的通用用途。 在JDK1.4之前,如果您想執行類似的操作,則必須手動編寫如下行

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

如果要向列表添加浮點值。 JDK1.4中的裝箱/拆箱功能試圖解決這一問題,並讓編譯器為我們完成此操作,但是不幸的是,您仍然必須了解兩者之間的區別,以了解發生的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM