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行目が誤って切り替えられたため、コンパイラーは私のreturn関数をメソッドとして見ていました。

これは、上記のサンプルコードをこの誤ったバージョンに変更するのと同じです。

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 に答える