Почему я получаю неоднозначную ошибку при вызове конструктора внутри того же класса в Java?
-
29-09-2019 - |
Вопрос
Я не могу понять, почему я получаю неоднозначную ошибку. Это образец кода того, что у меня есть:
public class MyString{
//Data:
private char[] theString;
//constructors:
public MyString(){ // default constructor
}
public MyString(String s){ // parameterized constructor
}
public MyString(char[] s){ // parameterized constructor
}
public MyString(MyString s){ // copy constructor
}
//A method that calls a constructor:
public MyString foobar(){
return new MyString(theString);
}
}
Вышеуказанное генерирует эту ошибку, когда Foobar () вызывается где -то еще:
./MyString.java:15: reference to MyString is ambiguous, both method MyString(char[])
in MyString and method MyString(theString) in MyString match
return new MyString(theString);
^
Есть идеи почему?
Решение
Я не могу воспроизвести вашу ошибку.
Но такая ошибка в основном происходит, когда вы пытаетесь вызвать функцию, а компилятор не имеет достаточной информации, чтобы определить, какой метод вызовать.
например, если вы делаете:
MyString tricky=new MyString(null);
Тогда компилятор не знает, является ли NULL быть Char [] или строкой или MyString, поэтому вы получаете неоднозначное сообщение об ошибке.
Обычный способ исправить это - добавить явный актерский состав, например:
MyString tricky=new MyString((String)null);
Будет работать....
Другие советы
Ага!! Я нашел проблему. Строки 260 и 261 моего код были случайно переключены, поэтому компилятор рассматривал мою функцию возврата в качестве метода.
Это было бы эквивалентом изменения приведенного выше примера кода на эту ошибочную версию:
public class MyString{
//Data:
private char[] theString;
//constructors:
public MyString(){ // default constructor
}
public MyString(String s){ // parameterized constructor
}
public MyString(char[] s){ // parameterized constructor
}
public MyString(MyString s){ // copy constructor
}
//A method that calls a constructor:
public MyString foobar(){
}
return new MyString(theString); //THIS LINE WAS OUT OF PLACE! SHOULD BE IN FOOBAR!
}