0

以下のような1行のコードを見ました:

for (String w : words) sentence.add(w); // words is declared as String[] words = ...;

私の知る限り、この形式で for ループを記述できるようにするには、Iterable インターフェイスを実装して iterator() 関数をオーバーライドするクラスのインスタンスである「単語」が必要だと思います。しかし、「words」は文字列配列型ですが、これをループ形式で正しくするにはどうすればよいですか?

誰かが私にいくつかのヒントを教えてもらえますか?

4

3 に答える 3

9

このテーマに関する Java チュートリアルから:

for-each コンストラクトは、反復子ではなくインデックス変数を非表示にする配列にも適用できます。次のメソッドは、値の合計を int 配列で返します。

// Returns the sum of the elements of a
int sum(int[] a) {
    int result = 0;
    for (int i : a)
        result += i;
    return result;
}

そして、JLS (Java 言語仕様) の §14.14.2 から:

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

EnhancedForStatement:
    for ( FormalParameter : Expression ) Statement

の型は、または配列型であるExpression必要があります。そうしないと、コンパイル時エラーが発生します。Iterable

ただし、配列は実装しないことに注意してくださいIterableJLSの§10.1から:

配列型の直接のスーパークラスはObject.

すべての配列型は、インターフェイスCloneablejava.io.Serializable.

于 2013-03-19T19:46:25.810 に答える
5

いつものように、Java 言語仕様は注目すべき場所です。この場合、それはセクション 14.14.2 の強化されたforステートメントです。

EnhancedForStatement:  
     for ( FormalParameter : Expression ) Statement

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

...

  • Expression の型が Iterable のサブタイプである場合、変換は次のようになります。[... イテラブルの処理方法の説明 ...]

  • それ以外の場合、Expression は必ず配列型T[]. [... 配列の処理方法の説明 ...]

于 2013-03-19T19:51:10.717 に答える
1

はい、Java のすべての配列がそうであるように (for each ループを使用して)、Iterable インターフェースを実装する任意のクラスのように反復できる方法で反復可能です。私の知る限り、配列は単なるオブジェクトであるため、このインターフェイスを実装していませんが、コンパイラは何らかの魔法を実行し、とにかくこれを機能させます。

于 2013-03-19T19:46:28.900 に答える