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