1
Object arr = new int[]{1,2,3};
arr = (int[])arr; 

int someArr [] = (int[])arr;

for(int i:arr)  // compilation error
     System.out.println(i);

for(int i:someArr) //works fine
     System.out.println(i);

2 行目のキャストで arr が int 配列に変換されないのはなぜですか? 4行目で「配列またはインスタンスのみを反復処理できます」というコンパイルエラーが発生しますjava.lang.Iterable。デバッグ中、2 行目で、変数 snapshot はインデックス付きの値で arr を示します。

4

7 に答える 7

5

このステートメントは、最初に に格納されてarr = (int []) arrいる値を にキャストしようとします。次に、代入ができるように、右辺の結果を左辺の変数の型にキャストしようとします。左側の変数の型が であるため、 にキャストバックされます。だからとどまる。arrint []=Objectint []ObjectarrObject

そこから何を学べるでしょうか。宣言された変数の型を変更することはできません。一度もない。特に、別のタイプのものを割り当てることによってそれを行うことはできません。割り当てが機能し、割り当てられた値が変数の宣言された型にキャストされるか、割り当てが失敗します。変数の型は変更されません。

于 2013-04-27T08:57:16.970 に答える
1

キャスティングは、それが使用されているラインでのみ機能します。次の行では、コンパイラはそれを忘れて、 の定義のみを参照しますがarr、これはまだObjectです。新しい変数を作成したくない場合は、コンパイラに何をすべきかを伝える必要がある場所にキャストを追加できます。

Object arr = new int[]{1,2,3};

for(int i : (int[])arr) // cast when using the object
    System.out.println(i);
于 2013-04-27T08:56:49.040 に答える
1

の配列またはインスタンスに対してのみ反復できますjava.lang.Iterable

これは、実行時 (つまり動的) 型ではなく、コンパイル時 (つまり静的) 型を指します。

arrのコンパイル時は です。つまり、実行時の型が何であるかObjectに関係なく、それを反復処理することはできません。

于 2013-04-27T08:57:32.150 に答える
1

宣言された型のarrbeing Object、コンパイラはそれが配列を参照しているかどうかわからないため、それを反復処理する方法がわかりません。

2 行目のキャストで arr が int 配列に変換されないのはなぜですか?

参照型 ( などObject) の場合、キャストは変換しませんが、参照が特定の型のオブジェクトを指していることを確認するだけです。そのチェックが成功すると、そのタイプのすべての機能を使用できるようになります (キャストが成功しない場合は、ClassCastException がスローされます)。

于 2013-04-27T09:01:27.667 に答える
1

ダウンキャスティングをしているからです。ダウン キャスティングでは、 Object から Int への明示的なキャストを行う必要があります。あなたがやっている。このような

for(int i:someArr) //うまくいきました。

したがって、この arr を int に明示的にキャストする必要があります。

アップ キャスティングでは、明示的なキャスティングを行っていません。デフォルトでは Implicit Casting が提供されています。

for(Object i=somearr)

ここで、Object はすべてのクラスのスーパー クラスです。

私の言いたいことはわかりましたか?

于 2013-04-27T09:03:04.797 に答える
0

arr はObject. Java魔法castのようにそれを好きにすることはできません。

for(int i:someArr )  // compile
                 System.out.println(i);
于 2013-04-27T08:51:03.540 に答える
0

あなたのキャストは のタイプを変更しませんarrarrtype はObject宣言したとおりであり、 を反復処理することはできませんObject

于 2013-04-27T08:52:39.783 に答える