[英]What happens when we pass int arguments to the overloading method having float as a parameter for one method and another having double param
在重載概念中,我有一個疑問,就是這樣。 當我使用int值重載方法時,方法調用的是float參數方法,而不是double參數方法。
void method1(float f){
System.out.println('float');
}
void method1(double f){
System.out.println('double');
}
方法調用:
method1(10);
輸出:浮動
如此鏈接中的java教程中所述,浮點字面值的類型為float,如果它以字母F或f結尾; 否則它的類型是雙倍的,它可以選擇以字母D或d結尾。
對於上面的情況,方法調用應該調用double參數方法。 但它調用了float參數方法。
如何在這個區域發生超載過程?
測試代碼的變體,除了byte
文字和帶有short
, int
和long
各種組合的重載方法之外,似乎暗示如果有多個可用的轉換器,編譯器會選擇“最小擴展”轉換。
從而:
short
和int
,如果使用byte
調用重載方法,則將選擇short
變量 int
和long
,如果使用byte
或short
調用重載方法,則將選擇int
變量 等等。
因此,因為long
可以加寬為float
或double
,並且因為float
轉換是“最小加寬”,所以選擇float
過載。
我認為這是因為“選擇最具體的重載”方式,編譯器解決了多個可能的重載。 從JLS,第15.12.2.5節:
非正式的直覺是,如果第一個方法處理的任何調用都可以傳遞給另一個沒有編譯時錯誤的調用,那么一個方法比另一個方法更具體。
因此,采用float
的方法比采用double
的方法“更具體”,因為采用float
的方法處理的任何調用總是可以通過采用double
的方法來處理,但不是另一種方法周圍。
根據http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
5.1.2。 擴大原始轉換
對原始類型的19個特定轉換稱為擴展原始轉換:
byte to short,int,long,float或double
短,int,long,float或double
char到int,long,float或double
int到long,float或double
長期浮動或加倍
漂浮加倍
在Java中,子類和超類之間存在關系,並且從字節short ...到double的基元也有升序。
規則是,只要存在選擇性重載方法的模糊性,就選擇最接近的一個子類重載方法或最接近的基元。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.