2008-12-12 2 views

ответ

44

Iterable<String> является эквивалентом IEnumerable<string> ,

Было бы странно в системе типов, если бы реализованы массивы Iterable. String[] является примером Object[], но Iterable<String> не является Iterable<Object>. Классы и интерфейсы не могут реализовывать один и тот же общий интерфейс с различными общими аргументами.

String[] будет работать как Iterable в усиленном цикле.

String[] может быть легко превращен в Iterable:

Iterable<String> strs = java.util.Arrays.asList(strArray); 

Предпочитают коллекции над массивами (для не-примитивов в любом случае). Массивы ссылочных типов немного странны и редко нужны с Java 1.5.

+2

Для получения дополнительной информации о _why_ вы не можете бросить между Iterable и Iterable , проверить [ковариации и контрвариацию] (http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29). – 2011-08-20 09:32:20

8

Вы ищете Iterable<String>?

Iterable<T> <=> IEnumerable<T> 
Iterator<T> <=> IEnumerator<T> 
2

Я считаю, что эквивалент Java равен Iterable<String>. Хотя String[] не реализует его, вы можете цикл по элементам в любом случае:

String[] strings = new String[]{"this", "that"}; 
for (String s : strings) { 
    // do something 
} 

Если вам действительно нужно что-то, реализующий Iterable<String>, вы можете сделать это:

String[] strings = new String[]{"this", "that"}; 
Iterable<String> stringIterable = Arrays.asList(strings); 
0

Iterable<T> в порядке, но есть небольшая проблема. Он не может быть легко использован в выражениях stream() i.e.

Если вы так хотите, вы должны получить его разделитель и использовать класс StreamSupport().