2

It is common idea that I cannot iterate on some structure with forEach if this structure isn't Iterable. But why I can iterate on array in Java? Array isn't Iterable.

MyClass[] array = {new MyClass("a"), new MyClass("b")};

for (MyClass c : array) {
    System.out.println(c);
}
Aaron
  • 1,294
  • 4
  • 14
  • 27
  • 3
    You can iterate over an array because the ranged-for construct works on both Iterables _and_ Arrays. The compiler generates one style of bytecode if the argument is an Iterable, and another if it's an Array. – DaoWen Dec 02 '14 at 18:51

3 Answers3

9

The reason is that the language has made an allowance for it. While it may represent the two objects differently, the sequence of iteration is the same - and the effect is transparent to you.

...Otherwise, the Expression necessarily has an array type, T[].

Let L1 ... Lm be the (possibly empty) sequence of labels immediately preceding the enhanced for statement.

The enhanced for statement is equivalent to a basic for statement of the form:

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    VariableModifiersopt TargetType Identifier = #a[#i];
    Statement
}

#a and #i are automatically generated identifiers that are distinct from any other identifiers (automatically generated or otherwise) that are in scope at the point where the enhanced for statement occurs.

TargetType is the type of the loop variable as denoted by the Type that appears in the FormalParameter followed by any bracket pairs that follow the Identifier in the FormalParameter (§10.2).

Makoto
  • 104,088
  • 27
  • 192
  • 230
1

The reason is because Java has a built in way of handling arrays in a for each loop. Check out this link

Community
  • 1
  • 1
brso05
  • 13,142
  • 2
  • 21
  • 40
1

The For-Each Documentation says in part The for-each construct is also applicable to arrays.

The JLS-14.4.2 The enhanced for statement says (in part),

The type of the Expression must be Iterable or an array type

Elliott Frisch
  • 198,278
  • 20
  • 158
  • 249