簡體   English   中英

Java-重載方法的奇怪任務

[英]Java - strange task for overloading methods

我有一個任務應該檢查我是否了解重載方法...

但是這個任務讓我更加困惑

對這個事實有什么解釋?

    bar(i,c);
    bar(l,c);   

輸出:

II
DL

有沒有計划如何解決這些任務,有沒有規則?

public class Foo{

    static void bar(int a, double b){
    System.out.println("ID");
    }

    static void bar(int a, int b){
    System.out.println("II");
    }

    static void bar(double a, long b){
    System.out.println("DL");
    }

    static void bar(float... a){
    System.out.println("FS");
    }

    static void bar(int a, byte b){
    System.out.println("IB");
    }

    static void bar(double a, double b){
    System.out.println("DD");
    }
    public static void main(String[] args) {


        int i=0;
        long l =0;
        float f=0;
        double d=0;
        char c='0';
        bar(i,f);
        bar(d,i);
        bar(i,c,i);
        bar(i,c);
        bar(l,c);

    }

}

如果有需要的功能long作為參數,並沒有一個采取long ,以及int被提供,則該int被自動提升long型。

如果有需要的功能double作為參數,並沒有一個采取double ,和一個long被提供,則該long被自動提升double型。 請注意,這種轉換導致您失去精度:並非53的2的冪的所有整數都可以用double精確表示。

這些規則當然可以推廣到帶有多個參數的函數,並解釋您正在觀察的輸出。

來自https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2

關於原始類型的19種特定轉換稱為擴展原始轉換:

字節到short,int,long,float或double

短至int,long,float或double

char轉換為int,long,float或double

int轉換為long,float或double

長時間漂浮或翻倍

浮動到兩倍

不斷擴大的原始轉換不會丟失有關數值總體大小的信息。

基本上,由於沒有long / char簽名,因此它將嘗試將它們升級為上述類型,並據此做出決策。 這里有一個相當復雜的算法:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12

更具體地說:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2

暫無
暫無

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

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