2017-01-19 45 views
1

下面是Iterables.isEmpty()ref)的源代码:将Iterables投射到集合是否遍历所有元素?

public static boolean isEmpty(Iterable<?> iterable) { 
    if (iterable instanceof Collection) { 
     return ((Collection<?>) iterable).isEmpty(); 
    } 
    return !iterable.iterator().hasNext(); 
} 

我在所有元素想知道如果Iterables.isEmpty()方法迭代如果给iterable参数是一种类型的Set,其延伸Collection。铸造IterableCollection会导致完全迭代吗?如果是这样,为什么?如果不是,为什么不呢? Iterables.isEmpty()is implemented as iterable.iterator().hasNext() for non-Collections

回答

7

如果给iterable

不,我想知道如果Iterables.isEmpty()在所有的元素方法进行迭代。它永远不会比第一个元素更进一步。

是否铸造可迭代到集合导致完整的迭代

号铸造无助于物体,它只是告诉编译器“相信你”,它可以作为子类来处理,而不是超类。

JLS Sec 15.6

的铸造表达...的检查,在运行时,即一个参考值指的是对象的类是与指定的参考类型或引用类型的列表兼容。