Java - 重载方法

时间:2016-03-29 09:31:48

标签: java casting

我有一个任务应该检查我是否理解重载方法...

但这项任务让我更加困惑

这个事实的解释是什么?

    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);

    }

}

2 个答案:

答案 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