2

私はEclipse Keplerで次のプログラムを使用しています

import java.util.Arrays;

public class Mainn {
    public static void main(String[] args) {    
        int[] a = {1, 2};
        int[] b = {1, 2};

        System.out.println(Arrays.deepEquals(a, b));    
    }
}

int[]引数が正式なパラメーターに適用されないというコンパイル時エラーが発生していObject[]ます。しかし、配列のデータ型としてInteger[]代わりに使用すると、同じプログラムが正常に動作し、.int[]ab

私はこれに混乱しています。Java docsによると、コンパイラはプリミティブとラッパークラスの間で自動的にオートボックス化およびボックス化解除するため、ここで機能するはずです。しかし、それは機能していません。なんで?

4

2 に答える 2

4

配列のサブタイプの規則は、Java 言語仕様から次のようになります。ここで、>手段はスーパータイプです。

S と T が両方とも参照型の場合、S[]> T[]iff S> T.

...

  • P がプリミティブ型の場合、次のようになります。
    • Object >1 P[]
    • Cloneable >1 P[]
    • java.io.Serializable >1 P[]

ここで、>1meansは直接のスーパータイプです。

この場合、 SisObjectおよびTis ですInteger。したがって、Integerは のサブタイプでObjectあり、したがってInteger[]のサブタイプであるためObject[]、 を期待するメソッドへの引数として使用できますObject[]

ただし、intプリミティブであるforObjectは のスーパータイプであるint[]ため、が期待さint[]れる場所では使用できません。Object[]

ここでは、ラッパー クラスの概念は適用されません。

于 2013-10-26T15:38:52.730 に答える
4

自動ボクシングはint(に変換されたInteger) のようなプリミティブに適用されますが、配列には適用されません - タイプのオブジェクトはint[]自動的にに昇格されませんInteger[]

このデザインの選択がなされた理由について具体的な情報源はありませんが、関連すると思われる点がいくつかあります。

  • int[]はすでにオブジェクトですが、自動ボクシングはプリミティブに適用されます。自動ボクシングint[](およびその他のケース) は、自動ボクシングの基準を大幅に複雑化します (場合によっては予期しない動作が発生する可能性があります)。
  • 自動ボクシングはゼロコストの操作ではありません。ボックス化は、新しい配列を作成してから、配列内のすべての要素の新しいラッパーを作成することを意味しますint[]Integer[]一般に、Java はコストのかかる操作を暗黙的に実行することを回避しようとします。
于 2013-10-26T15:39:27.857 に答える