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

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

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);
              ^

Есть идеи почему?

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Я не могу воспроизвести вашу ошибку.

Но такого рода ошибки в основном происходят, когда вы пытаетесь вызвать функцию, а у компилятора недостаточно информации о типе, чтобы определить, какой метод вызывать.

например. если вы делаете:

MyString tricky=new MyString(null);

Тогда компилятор не знает, подразумевается ли null как char [] или String или MyString, поэтому вы получаете неоднозначное сообщение об ошибке.

Обычный способ исправить это - добавить явное приведение, например ::

.
MyString tricky=new MyString((String)null);

Будет работать ....

0 голосов
/ 13 октября 2010

Aha !! Я нашел проблему. Строки 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!
}
...