【发布时间】:2020-07-29 16:45:11
【问题描述】:
我有以下方法:
public static <T> T[] toArray(Iterable<? extends T> iterable) {
return (T[]) StreamSupport.stream(iterable.spliterator(), false).toArray();
}
我的 IDE 告诉我有一个未经检查的演员表。 一般来说,我理解错误消息,但我不明白为什么要检查强制转换,因为可迭代的类型与我用于强制转换的类型相同。有人可以向我解释一下吗?
【问题讨论】:
-
嘿!你为什么要做
<? extends T>而不仅仅是<T>? -
这不是让整个事情更加面向未来吗?
-
不,为什么它会“面向未来”?你知道
? extends T做什么吗?如果用Animal[] as = toArray(some Iterable<Dog>)或Dog[] as = toArray(some Iterable<Animal>)或Dog[] as = toArray(some Iterable<Dog>)调用此方法会发生什么?它们中的哪一个有效,为什么并且是期望的? -
这里没有“未来证明”。它的作用是,它允许某人做
Animal[] animals = toArray(dogs),其中dogs是,例如List<Dog>。这是有道理的,但是,因为数组是协变的,所以不需要它。因此,如果您将其保留为T,您将返回一个Dog[],它也可以分配给Animal[],因为它是协变的。所以在这种情况下,通配符? extends T是不必要的。 -
我知道你在说什么。我一直在寻找其他实现,番石榴也使用它:link。有什么区别?