在超载概念中,我有一个疑问,就是这样。 当我使用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参数方法。但它调用了浮点参数方法。
如何在这个区域发生超载过程?
答案 0 :(得分:15)
测试代码的变体,除了使用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
的方法处理,但不是相反。
答案 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中,子类和超类之间存在关系,而且从字节短......到基数的基元也有升序。
规则是,每当存在歧义时,选择重载方法,选择最接近一个子类重载方法或最接近原语的升序。