Почему я получаю неоднозначную ошибку при вызове конструктора внутри того же класса в Java?

StackOverflow https://stackoverflow.com/questions/3918077

Вопрос

Я не могу понять, почему я получаю неоднозначную ошибку. Это образец кода того, что у меня есть:

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!
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top