为什么在Java中调用同一类中的构造函数时会出现不明确的错误?

为什么在Java中调用同一类中的构造函数时会出现不明确的错误?,java,methods,constructor,call,ambiguous,Java,Methods,Constructor,Call,Ambiguous,我不明白为什么我会有一个模棱两可的错误。这是我的示例代码: public class MyString{ //Data: private char[] theString; //constructors: public MyString(){ // default constructor } public MyString(String s){ // parameterized constructor } public MyStri

我不明白为什么我会有一个模棱两可的错误。这是我的示例代码:

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

知道为什么吗?

我不能重现你的错误

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

e、 g.如果您这样做:

MyString tricky=new MyString(null);
然后编译器不知道null是char[]还是String或MyString,因此会得到一条不明确的错误消息

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

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

将起作用……

我无法重现您的错误

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

e、 g.如果您这样做:

MyString tricky=new MyString(null);
然后编译器不知道null是char[]还是String或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!
}

啊哈!!我发现了问题。我的第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!
}

当这个代码工作时,你应该给我们非工作代码(在另一个网站,如ideone或grepcode中)。这是不工作的代码,还是与不工作的代码类似?我发现错误会引用
方法MyString(theString)
作为不包含类型的模糊签名之一。当没有人可以重现该问题时,谁会投票支持该问题?我认为这是编译器错误,我无法重现它。您使用的是哪个版本的JDK和OS?另外,你能分享你调用foobar()的代码吗?当这个代码工作时,你应该给我们非工作代码(在另一个网站,如ideone或grepcode中)。这是不工作的代码,还是与不工作的代码类似?我发现错误会引用
method MyString(theString)
作为不包含类型的模糊签名之一。当没有人可以重现该问题时,谁会投票支持该问题?我认为这是编译器错误,我无法重现它。您使用的是哪个版本的JDK和OS?另外,您是否可以共享调用foobar()的代码,但这会导致不同的编译器错误。类型的非法启动。实际上,在编译我的main()程序时,它没有给出该错误,只是给出了不明确的错误。然后,当我试图自己编译MyString类时,它确实给了我这个错误。无论我编译什么(AppDriver vs Class),它都应该给出相同的错误吗?但这应该给你一个不同的编译器错误。类型的非法启动。实际上,在编译我的main()程序时,它没有给出该错误,只是给出了不明确的错误。然后,当我试图自己编译MyString类时,它确实给了我这个错误。无论我编译什么(AppDriver vs Class),它都应该给出相同的错误吗?