1

私はJavaSe7 OCAに取り組んでいますが、以下のコードがコンパイルされない理由を理解できませんでした。mainメソッドでaMethodを呼び出すと、メソッドがあいまいであることを示すコンパイルエラーが発生します。このオーバーロードメソッドのサンプルでは、​​拡大とボクシングの間の優先順位の規則が衝突しているようです。

public class Overloading {
public static void main(String[] args) {
    Byte i = 5;
    byte k = 5;
    aMethod(i, k);
}

static void aMethod(byte i, Byte k) {
    System.out.println("Inside 1");
}

static void aMethod(byte i, int k) {
    System.out.println("Inside 2");
}

static void aMethod(Byte i, Byte k) {
    System.out.println("Inside 3 ");
}
}

エラーは「メソッドaMethod(byte、Byte)はタイプOverloadingに対してあいまいです」です。最初の方法をコメントアウトすると、2番目の方法でも同じエラーが発生します。

私の考えは次のとおりです。最初の方法は開封とボクシングが必要です。2番目の方法は開開と拡大が必要です。3番目の方法は開封とボクシングのみが必要です。したがって、必要な変換が最も少なく、すべてがボクシング変換であるため、3番目の方法である必要があります。

4

4 に答える 4

0

このクラスには2つの等しいメソッドがあります

static void aMethod(Byte i, Byte k) {
    System.out.println("Inside 3 ");
}

static void aMethod(byte i, Byte k) {
    System.out.println("Inside 1");
}

バイト自動変換バイトなので、コンパイルエラー

于 2013-03-19T07:05:00.517 に答える
0

問題は、これらすべての方法にあります。

static void aMethod(byte i, Byte k) {
    System.out.println("Inside 1");
}

static void aMethod(byte i, int k) {
    System.out.println("Inside 2");
}

static void aMethod(Byte i, Byte k) {
    System.out.println("Inside 3 ");
}

Javaは、どちらを順番に呼び出す必要があるかを認識していません。

    aMethod(i, k);

パラメータiとは、 JLS仕様kに従って、さまざまな方法で変換できます。

i(5.1.8)にunboxedすることも、(5.1.1)として残すこともできます->2つのバリアントbyteByte

k(5.1.7)boxedにすることも、タイプ(5.1.2)->2つのバリアントに拡張することもできます。Byteint

于 2013-03-19T07:10:29.947 に答える
0

実際には定義ではありませんが、呼び出しはあいまいです。なぜなら、Javaのすべての整数はデフォルトでintです。バイトb=5と言っても、5は内部でintに変換されます。ただし、参照はバイトであるため、この場合、メソッド2および3を呼び出すオプションがあります。したがって、コンパイラーは何を呼び出すかを理解できません。

うまくいくaMethod(i, (Byte)k)はずです。

于 2013-03-19T07:17:05.553 に答える
0

Javaでメソッドをオーバーロードするときは、次の点に注意する必要があります。

  1. プリミティブ型の拡張では、完全に一致するものが見つからない場合、すぐ次のより広い型のメソッド引数が使用されます。

  2. Boxingとvar-argsは、個別に使用される場合、メソッドのオーバーロードと互換性があります。

  3. あるラッパータイプを別のラッパータイプに拡張することはできません。たとえば、整数を長整数に拡張することはできません。

  4. 拡大とそれに続くボクシングは機能しません。たとえば、intをLongに渡すことはできません。

  5. ボックス化された引数がオブジェクト型参照に渡された場合、ボックス化とそれに続く拡張は1つの状況でのみ機能します。intは、整数を介してオブジェクトに渡すことができます。

  6. Var-argsは、拡大またはボクシングのいずれかと組み合わせることができますが、注意が必要です。

上記のコードでは、Javaの中間結果がint式のintに変換されるため、aMethodに渡される引数は適切に型キャストする必要があります。

于 2015-06-15T06:48:27.400 に答える