4

このコードは次のとおりです。

int[] someArray = {0, 1, 2, 3};
//System.out.println(someArray[0].toString()); int cannot be dereferenced
// creating Object element with use of primitive element fails
//Object newObject = new Object(someArray[0]); constructor Object in class java.lang.Object cannot be applied to given types;
for(Object someObject : someArray)
{
    // here int is casted to Object
    System.out.println(someObject.toString()); // prints 0, 1, 2, 3
}

プリミティブ型の変数(配列の要素)を明示的にObjectにキャストできないのに、どういうわけかforループでこのプリミティブ要素がObjectにキャストされるのはどうしてですか?

4

1 に答える 1

7

1.5以降、Javaコンパイラは、コンテキストで要求されたときに、プリミティブ型自動的にボックス化およびボックス化解除します。(つまり、はオブジェクトにラップされ、その逆も同様です。)これは、プリミティブとオブジェクト変数の間で割り当てるときに発生します。(または、プリミティブをオブジェクト型にキャストします。)したがって、たとえば、次のコードが有効です。intInteger

int i = 123;
Object o = i;

Object someInt = someArray[…]コンパイラがforeachループに対して発行する暗黙の割り当てについても同じことが言えます。

someArray[0].toString()動作しない理由はsomeArray[0]、オブジェクト型の変数に割り当てたり、コンパイラにオートボックスを指示するようなことをしていないためです。プリミティブでメソッドを呼び出そうとすると、条件の1つとして認識されません。これが発生するはずです。

于 2012-12-15T16:25:05.717 に答える