我有一个任务应该检查我是否理解重载方法...
但这项任务让我更加困惑
这个事实的解释是什么?
bar(i,c);
bar(l,c);
输出:
II
DL
是否有任何计划如何解决此类任务,任何规则?
public class Foo{
static void bar(int a, double b){
System.out.println("ID");
}
static void bar(int a, int b){
System.out.println("II");
}
static void bar(double a, long b){
System.out.println("DL");
}
static void bar(float... a){
System.out.println("FS");
}
static void bar(int a, byte b){
System.out.println("IB");
}
static void bar(double a, double b){
System.out.println("DD");
}
public static void main(String[] args) {
int i=0;
long l =0;
float f=0;
double d=0;
char c='0';
bar(i,f);
bar(d,i);
bar(i,c,i);
bar(i,c);
bar(l,c);
}
}
答案 0 :(得分:1)
如果有一个函数以long
作为参数,并且没有人使用long
,并且提供了int
,那么int
是自动提升到long
类型。
如果有一个函数将double
作为参数,并且没有人使用double
,并且提供了long
,那么long
是自动提升到double
类型。请注意,此转换可能会导致您失去精确度:并非所有超过5次幂的2的整数都可以用double
完全表示。
当然,这些规则可以概括为具有多个参数的函数,并解释您正在观察的输出。
答案 1 :(得分:0)
来自https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-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
长期漂浮或加倍
浮动加倍
扩展的原始转换不会丢失有关的信息 数值的整体幅度。
基本上,由于没有长/字符签名,它会尝试将它们提升为上述类型并根据它做出决定。 这里有一个相当精细的算法:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12
更具体地来说:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2