5

ここでは Java 初心者です。私はC#の方がはるかに快適です。そうは言っても、次のことは私を困惑させます。Java で異なるパラメータ シグネチャを持つオーバーロードされたクラスをいくつか書いています。ただし、Object と double を区別できないようです。ただし、Object と Double では問題ありません。誰かが何が起こっているのか説明できますか?

public void item(Object a, Object b, String c, String d) {/*Stuff*/}
public void item(double a, double b, String c, String d) {/*Stuff*/}

public void UseIt(double a, double b, Double c, Double d)
{
    item(a, b, someString, someOtherString);   // Claims it's ambiguous
}

それとも私の開発システムがばかげているだけですか?

例について申し訳ありません。それは失敗したもののようなものです(実際にはここに置くことはできません)、入力する前に試していないという間違いを犯しました...

4

3 に答える 3

9

このクラスは問題なくコンパイルされます (念のためテストし、Test.java に入れ、コマンド ラインからコンパイルしました)。

public class Test {
    public void item(double a, double b, String c, String d) {/*Stuff*/}
    public void item(Object a, Object b, String c, String d) {/*Stuff*/}
    public void UseIt(double a, double b, Double c, Double d) {
        item(a, b, "", "");   // Claims it's ambiguous
    }
}

問題は、2 つの文字列ではなく、2 つの double (c と d) を 3 番目と 4 番目の引数として渡していることに関連している可能性があります。

于 2013-06-07T16:52:54.110 に答える
4

これは、IDE (この場合は誤解を招く可能性があります) がオートボクシングの可能性を認識しているためです。

たとえば、 を作成した場合、List<Integer>それに を追加できます。 からへのintオートボクシングがあります。Unxobing は逆です:へ。ボックス化とボックス化解除の両方が数値プリミティブ型にのみ適用されることに注意してください (ただし、それらの配列には適用されません)。intIntegerIntegerint

ここでは、 のメソッドが最終的に選択されることは間違いありませんdouble(より具体的であるため) が、IDE はあいまいさが存在する可能性があると見なします。

このコード例:

public final class Test
{
    public static void item(Object a, Object b, String c, String d)
    {
        System.out.println("Object");
    }

    public static void item(double a, double b, String c, String d)
    {
        System.out.println("double");
    }

    public static void unbox(final double d)
    {
        System.out.println("Unboxed!");
    }

    public static void useIt(double a, double b, Double c, Double d)
    {
        // primitives
        item(a, b, "", "");
        // cast to corresponding classes
        item((Double) a, (Double) b, "", "");
        // objects
        item(c, d, "", "");
        // unboxed by the "unbox" method which takes a "double" as an argument
        unbox(new Double(2.0));
    }

    public static void main(final String... args)
    {
        // Autoboxing of the third and fourth argument
        useIt(1.0, 1.0, 1.0, 1.0);
    }
}

出力:

double
Object
Object
Unboxed!

ただし、次の呼び出しはできないことに注意してください。

useIt((Double) a, b, c, d); // No autoboxing of "b"
于 2013-06-07T16:47:33.820 に答える
-2

4 つのパラメーターを持つ同じ名前の 2 つのメソッドがあるため、コンパイラーは参照しているメソッドを認識できない可能性があります。あなたの呼び出しは、あなたが呼び出したいものを明確に定義していません。いずれかの項目メソッドの名前を変更するか、パラメーターをより具体的に定義する必要があります。

于 2013-06-07T16:48:31.097 に答える