编译器选择其中一个重载方法的标准

时间:2012-10-27 22:40:31

标签: java overloading

将一个方法更改为另一个方法(通过编译器)的正式原因是什么? 为什么它选择第一个用于字节等。我知道int可以表示字节,但也可以表示浮点数。为什么这么正式?

public class MethodCurrier {

    public void setValue(int wrt){//naglowek
        System.out.println("Typ int "+ wrt);
    }
    public void setValue(float wrt){//naglowek
        System.out.println("Typ float "+ wrt);
    }
    public static void main(String[] args) {
        MethodCurrier currier = new MethodCurrier();
        currier.setValue(4);//int
        currier.setValue(2.3f);//float
        currier.setValue('c');//char
        currier.setValue((byte)4);

    }
}

2 个答案:

答案 0 :(得分:5)

Java语言规范defines如下:

  

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。

     

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

在您的情况下,int方法比float方法更具体,因为int可以隐含地转换为float,但反之亦然。

答案 1 :(得分:2)

因为Java Language Specification是这样说的。