簡體   English   中英

當我們將int參數傳遞給重載方法時會發生什么,其中float作為一個方法的參數而另一個方法具有雙重參數

[英]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文字和帶有shortintlong各種組合的重載方法之外,似乎暗示如果有多個可用的轉換器,編譯器會選擇“最小擴展”轉換。

從而:

  • shortint ,如果使用byte調用重載方法,則將選擇short變量
  • intlong ,如果使用byteshort調用重載方法,則將選擇int變量

等等。

因此,因為long可以加寬為floatdouble ,並且因為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.

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