0

次のシナリオでは、タイプ E の 2 つの配列を受け入れるメソッドがあります。この E パラメータは、両方の配列を任意のタイプにすることができますが、同じでなければならないことを理解していました (この質問から派生したように)。1 つは Integer で、もう 1 つは Double の 2 つの配列でこれをテストしましたが、エラーは発生しません。私が受け取る出力は「14」です。これは、エラーがスローされていない両方の配列の合計サイズです。

なぜこれが機能するのか、誰かが光を当てることができますか?

public static <E> void showCombinedLength(E[] array1, E[] array2){
    System.out.println(array1.length + array2.length);
}

public static void main(String[] args) {
    Integer[] integerArray = {1, 2, 3, 4, 5, 6, 7};
    Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
    PrintArray.showCombinedLength(integerArray, doubleArray);
}

出力:

14

4

3 に答える 3

4

メソッド定義で単一のジェネリック型を定義する場合、同じ型の2つの配列でのみメソッドを使用できます。

ただし、Javaでは、配列型は共変であるため、Integer[]とDouble[]はどちらもObject[]のサブクラスです(これらはNumber []のサブクラスでもあります)。したがって、コードは常にコンパイルされ、複数の型パラメーターを指定する必要はありません。

于 2013-01-06T14:47:25.877 に答える
2

あなたの配列は両方ともオブジェクトの配列です。で呼び出す

PrintArray.<Integer>showCombinedLength(integerArray, doubleArray);

コンパイラはコンパイルを拒否します。

于 2013-01-06T14:45:39.117 に答える
-1

ジェネリックはバージョン1.5でJavaに導入されました。後方互換性のため、Javaバイトコードは、あるメソッドがジェネリックであり、別のメソッドがジェネリックではないことを認識していません。これが、コンパイル後のメソッドが実際に次のようになる理由です。

public static void showCombinedLength(Object[] array1, Object[] array2)

すべてのジェネリック型は実際にはに変更されていObjectます。つまり、とは両方ともInteger[]Double[]実際にはメソッドを持つオブジェクトの配列ですlength。これが、このコードが機能する理由です。

于 2013-01-06T14:46:23.793 に答える