繁体   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