1

我不知道为什么我会得到一个模棱两可的错误。这是我所拥有的示例代码:

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

任何想法为什么?

4

2 回答 2

1

我无法重现您的错误。

但是这种错误基本上发生在您尝试调用函数并且编译器没有足够的类型信息来确定要调用哪个方法时。

例如,如果你这样做:

MyString tricky=new MyString(null);

然后编译器不知道 null 是 char[] 还是 String 还是 MyString,因此您会收到一条模棱两可的错误消息。

解决此问题的常用方法是添加显式强制转换,例如:

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

将工作....

于 2010-10-12T19:41:33.910 回答
0

啊哈!!我发现了问题。我的代码的第 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!
}
于 2010-10-13T00:15:07.927 回答