2011-11-13 3 views
4

ここで何が起こっているか教えてもらえますか? myObjがString []にキャストされているので、forループで反復処理できるように見えます。しかし、新しいString []として構築されました。なぜそれをキャストする必要がありますか?for each each構文キャスト

public static void main(String args[]) { 
    Object myObj = new String[]{"one", "two", "three"}; 
    for (String s : (String[])myObj) { 
     System.out.print(s + "."); 
    } 
} 

ありがとう!

+1

「オブジェクト」として宣言されているので –

答えて

5

String[]として作成されても問題はありません。それにはObjectの参照のみがあります。これはfor-eachとは関係ありません。次のいずれもコンパイルされません。

Object myObj = new String[]{"one", "two", "three"}; 
System.out.println(myObj.length); // There is no Object.length 
+0

はい、もちろんです。ありがとう。 – m0therway

0

なぜ実際の型として配列を宣言していませんか?このように:あなたはObjectとしてmyObjを宣言すると、そのようにして

Syting[] myObj = new String[]{"one", "two", "three"}; 

、キャストは

2

必要はありません、あなたはそれが何か他のものであることを忘れて、それを告げました。

0

見かけの型と実際の型には違いがあります。 Object myObj []文は、オブジェクトの配列を宣言していることをJavaに通知します。コンパイル時には、それがJavaが関心を持つ唯一の型です。後で配列の要素にアクセスしようとすると、JavaはObjectとみなします。 Stringは実際の型と呼ばれ、実行時にのみ「既知」です。それゆえ鋳造の理由。

0

反復しようとしているオブジェクトのタイプは、コンパイル時にチェックされます。コンパイル時には、変数の宣言された型だけが利用可能です。コンパイラは実際にString []をそこに置くことを[確実に、常に]理解することはできません(理由を知るためにgoogleの "停止問題")。
ランタイムの型情報は、多態性、型キャストなどのために使用されます。現時点では考えられないこともあります。