2015-03-31 2 views
2

Я пытаюсь понять метод перегружать, и я не в состоянии понять причину следующей ошибки коды в следующем примереМетод неоднозначен

public class OverLoading_OverRiding { 
    public static void main(String[] args) { 
     OverLoading_OverRiding o = new OverLoading_OverRiding(); 
     o.sum(5, 5); 
    } 

    void sum(int i, long j) { } 
    void sum(long i, int j) { } 
} 

Я получаю сообщение об ошибке:

The method sum(int, long) is ambiguous for the type OverLoading_OverRiding.

Когда я совершаю явное приведение на том же примере, то он работает:

o.sum(5, (long)5); 

ответ

1

i can't able to proper understand ambiguous type error reason

Компилятор говорит, что он не знает, какой метод вызывать. вызвать вызов неоднозначно.

4

Проблема заключается в том, что ваш компилятор не знает, какой метод следует использовать, если вы звоните o.sum(5, 5);

  1. он мог бы использовать void sum(int i, long j) { }, где он занимает первые 5 как междунар и второй 5 до тех пор,

  2. он мог бы использовать void sum(long i, int j) { } , где он принимает первые 5 до тех пор, а второй 5, как INT

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

если вы звоните o.sum(5, (long)5); он соответствует только метод void sum(int i, long j) { }


Вопрос, почему вы бы перегружать это метод таким образом? В основном перегрузка используются для дополнительных параметров, как это:

void myMethod(int i) {} 
void myMethod(int i, bool b) {} 
void myMethod(int i, string s) {} 

так что вы могли бы назвать этот метод, как:

myMethod(42); 
myMethod(42, true); 
myMethod(42, "myString"); 

Может быть, это дает представление о том, перегрузке методы.

+0

yes TobiasR я знаю идею о перегрузке метода, но моя проблема в понимании ошибки –

+0

@Dhruv Raval обновлена. Может быть, теперь это станет более ясным. –

1

Поскольку 5 может быть представлен как в виде long и как int компилятора не может сделать вывод без дополнительной информации, к какому из этих двух методов для вызова, так как их метод подпись совместит для того же вызов.

Когда вы передаете второй аргумент long, компилятор может сделать вывод о том, что вторая подпись может использоваться, поскольку нет другой опции.

также:

o.sum((int)5, 5); // or long 

будет работать по той же причине

0

Это происходит потому, что 5 может быть неявным длинными или целым числом .. По этой причине, вызов метода неоднозначен.

0

просто вы ВГА пройти надлежащий аргумент в методе, который в первом случае o.sum (5, 5l) здесь первый аргумент INT 5 и второй является 5л для длительного и для второго случая (5л, 5). это будет работать нормально

1

Вот причина,

Случай 1: сумма (Int А, долго б);

Здесь сумма (5,5) соответствует этому методу.

Как? С первого параметра is int & вызывающий способ тоже int. Теперь следующий параметр длинный, но мы передаем int. И что? он удовлетворяет расширяющему преобразованию/неявному типу.

Пример неявного типа:

int i=10; 
double j; 
j=i; 
System.out.println(j); // Output j=10.0 

То же самое происходит и здесь, сумма (5,5) соответствует => сумма (интермедиат, длинный) & сумма (длинный, целый)

Случай 2: сумма (долго, Int б)

сумма (5,0, 5) соответствует оба метода

Смежные вопросы