当我们将int参数传递给重载方法时会发生什么,其中float作为一个方法的参数而另一个方法具有双重参数
在重载概念,我有一个疑问,那就是。 当我使用int值重载方法时,方法调用的是float参数方法,而不是double参数方法。
void method1(float f){ System.out.println('float'); } void method1(double f){ System.out.println('double'); }
方法调用:
method1(10);
输出:浮动
如此链接中的java教程中所述,如果浮点文字以字母F或f结尾,则浮点文字的类型为float; 否则它的类型是双倍的,它可以选择以字母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的基元也有升序。
规则是,每当存在选择重载方法的歧义时,选择最接近一个子类重载方法或最接近原语的升序。