[英]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.