2016-03-22 4 views
4

Предположим, что я один перегруженный класс, как показано нижеAmbiguty и не подходящий метод нашел ошибку в Java перегружать

class Test{ 
    public void m1(int a,float b){ 
     System.out.println("hello"); 
    } 
    public void m1(float a,int b){ 
     System.out.println("hai"); 
    } 
    public static void main(String[] args){ 
     Test t = new Test(); 
     t.m1(10,10);//error 
     t.m1(10.5f,10.6f);//error 
    } 
} 

, когда я называю m1() метод с двумя INT значения, как m1(10,10) ошибка

error: reference to m1 is ambiguous, both method m1(int,float) in Test and method m1(float,int) in Test match 
t.m1(10,10); 
^ 

и когда я вызываю m1() метод с двумя значениями с плавающей запятой, такими как m1(10.5f,10.6f) ошибка

error: no suitable method found for m1(float,float) 
t.m1(10.5f,10.6f); 
^ 
method Test.m1(float,int) is not applicable 
    (actual argument float cannot be converted to int by method invocation conversion) 
method Test.m1(int,float) is not applicable 
    (actual argument float cannot be converted to int by method invocation conversion) 

Может кто-нибудь объяснить причину, почему эта программа показывает два разных типа ошибок?

+0

Интересно, почему вы ожидаете равных ошибок? Как должен компилятор _promote_ 'float' в' int', когда 'int' является« более низким »типом данных, который вызывает потерю данных? – Tom

+0

Я думал, что в области области компилятор не нашел методы, которые я вызываю, поэтому я ожидал 'никакой подходящей ошибки метода' для обоих вызовов метода –

+0

И почему вы считаете, что оба метода не подходят, когда вы вызываете их с' int'? – Tom

ответ

5

Когда вы пытаетесь передать int аргумент метода, ожидающей float, аргумент может быть автоматически преобразован из int в float через widening primitive conversion (расширяющее примитивное преобразование не теряет информацию об общей величине числового значения). Поэтому оба метода могут выполнить вызов t.m1(10,10), и компилятор не может выбирать между ними (поскольку оба требуют преобразования одного из аргументов от int до float, поэтому ни один из этих двух методов не является более подходящим, чем другой для данные аргументы). Следовательно, ошибка reference to m1 is ambiguous.

Когда вы передаете float аргумент метода, который ожидает int, аргумент не может быть преобразован в int без явного приведения к int, так как там будет потеря точности, когда float усекается до int , Поэтому ни один из ваших методов не может выполнить t.m1(10.5f,10.6f).

+0

«преобразован из int в float без потери данных» Обычно (для всех ints) это неверно. – Matthias

+0

@Matthias Вы правы. Я был неточен. Я отредактирую. – Eran