1

Java 5 以降では、何らかの形式の「ボクシング」が配列に適用されますか? この質問は、次のコードが Iterable であるかのように配列を通過するときに思い浮かびました。

for( String : args ){
// Do stuff
}
4

4 に答える 4

5

配列はプリミティブではありません。プリミティブは、オブジェクトではないものです。boolean、char、byte、short、int、long、float、および double のみがプリミティブです。配列は特別な構文を持つオブジェクトです。Java < 5 の型で toString() を呼び出すことができる場合、それはプリミティブではありません。

オートボクシングが行うのは、ArrayList などのオブジェクトを想定するオブジェクトとの間でプリミティブを変換することだけです。次のようなコードを許可します。

List<Integer> l = new ArrayList<Integer>();
l.add( 7 );
int i = l.get(0);

省略形:

List<Integer> l = new ArrayList<Integer>();
Integer ii = Integer.valueOf( 7 )
l.add( ii );
int i = l.get(0).getIntValue();

これは、オートボクシングが行うすべてです。String はすでにオブジェクトであるため (C の場合とは異なり、char[] と同等ではありません)、String をボックス化/ボックス化解除する必要はありません。


編集:前述のようにブール値を追加

于 2011-06-02T15:38:38.550 に答える
3

特に強化された for ループについて疑問に思っているように思われるので、その答えは、それらがアンボックス化されたものではなく、特殊なケースであるということです。§14.14.2から:

強化された for ステートメントの形式は次のとおりです。

EnhancedForStatement:
    for ( VariableModifiersopt Type Identifier: Expression) Statement

Expression は Iterable 型であるか、配列型(§10.1) である必要があります。さもないと、コンパイル時エラーが発生します。

実際、式が配列の場合、実際に反復子を使用するのではなく、同等のインデックス付き for ループに変換されます。正確な展開は、言語仕様の同じセクションでカバーされています。

于 2011-06-02T15:40:30.983 に答える
2

いいえ、配列は常に参照型です。各要素へのアクセスでない限り、ボックス化またはボックス化解除の必要はありません。例えば:

int[] x = new int[10]; // The value of x is a reference

int y = x[0]; // No boxing
Integer z = x[1]; // Boxing conversion from x[1] (which is an int) to Integer

また、強化された for ループは配列と iterable の両方で使用できますが、コンパイル方法はそれぞれ異なります。

拡張 for ループの 2 つの異なる翻訳については、JLS のセクション 14.14.2を参照してください。

于 2011-06-02T15:38:00.890 に答える
1

いいえ。

プリミティブとは異なり、配列 (および文字列) はObjectです。

于 2011-06-02T15:37:51.890 に答える