2

Java では、関数のあいまいさに直面しています。
基本的に、次のような関数を定義 している可変引数関数をオーバーロードしています

        static void f(Integer... a)
        {
            // .. some statements

        }

        static void f(float f,Integer... a)
        {
            // .. some other statements
        }

次の関数呼び出しで関数を呼び出すことができます

f(1,2);
f(1.2f,1,2);

そして、このエラーメッセージがポップアップします

error: reference to f is ambiguous, both method f(Integer...) in Test and method f(float,Integer...) in Test match
        f(1,2);
        ^

ここでJavaの基本的な概念が欠けているかどうかを誰かが理解するのを手伝ってくれますか? thnx ..

4

4 に答える 4

3

どちらのメソッドも、入力した最初のパラメーターを受け取ることができるため、f(1,2);あいまいさが生じます。あなたがするなら

f((float)1,2);

たとえば、エラーは発生しません

于 2013-08-04T14:23:05.927 に答える
3

Java 言語では、int 値を float 値に自動的にキャストできます (逆は許可されません)。

そのため、電話をかけるときは

f(1,2)

Java コンパイラは、自動型変換で許可されるすべての可能なシグネチャに一致します。つまり、次のようになります。

  • f(整数、整数)
  • f(float, int)
  • f(フロート、フロート)
  • f(整数、浮動小数点数)
  • f(int, ...)
  • f(フロート, ...)

f(int, ...) と f(float, float) のどちらを呼び出すつもりだったのか、コンパイラーが認識できないあいまいさが存在します。

于 2013-08-04T14:23:57.503 に答える
2

複数の方法が適用可能な場合、コンパイラは最も具体的な方法を見つけようとします。2 つのメソッドが最大限に具体的である場合、あいまいさがあり、エラーが発生します。

要約すると (実際のルールはもう少し複雑です):

  • コンパイラは、 for f(1, 2)、両方の方法が適用可能であると判断します (1 は整数または浮動小数になります)。
  • 次に、コンパイラはどのメソッドがより具体的であるfloatかを判断する必要があります。あなたの場合、との間に関係がないため、仕様で定義されている意味でより具体的なものはありませんInteger(例: f(int i, Integer... j)vsがある場合f(float f, Integer... j)、前者はより具体的ですintはプリミティブの中よりも具体的であるためfloat. 同様に、 af(Number f, Integer... i)と a があるf(Integer... i)場合、後者はIntegerextendsのため、より具体的になりますNumber)。
于 2013-08-04T14:29:29.220 に答える
1

ランタイムは、整数のリストを使用して関数をキャストして、いずれかの関数を呼び出すことを選択できます。そこが混乱の元です。指定した整数のリストは、単一の先頭の浮動小数点数の後に整数のリストが続く別の呼び出しに変換することもできます。

于 2013-08-04T14:19:35.737 に答える