Массивы должны поддерживать Iterable
, они просто не поддерживают, по той же причине, что массивы .NET не поддерживают интерфейс, который обеспечивает произвольный доступ только для чтения по позиции (такой интерфейс не определен как стандартный). По сути, в фреймворках часто есть небольшие пробелы, которые не стоит никому исправлять. Не имеет значения, могли бы мы сами исправить их каким-то оптимальным способом, но часто мы не можем.
ОБНОВЛЕНИЕ: Чтобы быть беспристрастным, я упомянул массивы .NET, не поддерживающие интерфейс, поддерживающий произвольный доступ по позиции (см. Также мой комментарий). Но в .NET 4.5 этот точный интерфейс был определен и поддерживается массивами и классом List<T>
:
IReadOnlyList<int> a = new[] {1, 2, 3, 4};
IReadOnlyList<int> b = new List<int> { 1, 2, 3, 4 };
Все еще не совсем идеально, потому что интерфейс изменяемого списка IList<T>
не наследует IReadOnlyList<T>
:
IList<int> c = new List<int> { 1, 2, 3, 4 };
IReadOnlyList<int> d = c; // error
Возможно, есть вероятность обратной совместимости с таким изменением.
Если есть какие-либо успехи в подобных вещах в новых версиях Java, мне было бы интересно узнать в комментариях! :)