当我们将int参数传递给重载方法时会发生什么,其中float作为一个方法的参数而另一个方法具有双重参数

时间:2014-06-18 07:40:05

标签: java oop overloading

在超载概念中,我有一个疑问,就是这样。 当我使用int值重载方法时,方法调用浮点参数方法而不是双参数方法。

void method1(float f){
System.out.println('float');
}

void method1(double f){
System.out.println('double');
}
  

方法调用:

method1(10);
  

输出:float

正如本link中的java教程所述 如果浮点字面值以字母F或f结尾,则浮点字面值为float类型;否则它的类型是双倍的,它可以选择以字母D或d结尾。

对于上述情况,方法调用应该调用double参数方法。但它调用了浮点参数方法。

如何在这个区域发生超载过程?

3 个答案:

答案 0 :(得分:15)

测试代码的变体,除了使用byte文字和重载方法以及shortintlong的各种组合之外,似乎意味着编译器如果有多个转换,则选择“最小扩展”转换。

因此:

  • shortint之间,如果您使用byte调用重载方法,则会选择short变体
  • intlong之间,如果您使用byteshort调用重载方法,则会选择int变体

等等。

因此,因为long可以扩展为floatdouble,并且float转换是“最小扩展”,float选择过载。


认为这是因为“选择最具体的重载”方式,编译器解决了多个可能的重载。来自JLS,第15.12.2.5节:

  

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。

因此,采用float的方法比采用double的方法“更具体”,因为采用float的方法处理的任何调用都可以由一个采用double的方法处理,但不是相反。

答案 1 :(得分:7)

根据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 to int,long,float或double

     

int to long,float或double

     

长期漂浮或加倍

     

浮动加倍

答案 2 :(得分:0)

在Java中,子类和超类之间存在关系,而且从字节短......到基数的基元也有升序。

规则是,每当存在歧义时,选择重载方法,选择最接近一个子类重载方法或最接近原语的升序。