我有以下方法:
public static <T> T[] toArray(Iterable<? extends T> iterable) {
return (T[]) StreamSupport.stream(iterable.spliterator(), false).toArray();
}
我的IDE告诉我有一个未检查的转换。 总的来说,我理解错误消息,但我不明白为什么应该检查转换,因为可迭代对象(iterable)具有与我用于转换的相同类型。请问有人能解释一下吗?
我有以下方法:
public static <T> T[] toArray(Iterable<? extends T> iterable) {
return (T[]) StreamSupport.stream(iterable.spliterator(), false).toArray();
}
我的IDE告诉我有一个未检查的转换。 总的来说,我理解错误消息,但我不明白为什么应该检查转换,因为可迭代对象(iterable)具有与我用于转换的相同类型。请问有人能解释一下吗?
我不明白为什么需要检查转换类型。
检查转换类型是指导致checkcast
字节码指令的转换。例如:
String s = (String) someObject;
checkcast
指令,因为在代码的该点没有已知类型:由checkcast
检查的类型静态地写入了字节码;但是你的方法必须适用于所有类型。因此,这里不能添加checkcast
。Integer[] ints = toArray(iterableOfInts);
Integer[] ints = (Integer[]) toArray(iterableOfInts);
Object[]
无法转换为Integer[]
。但是失败发生在这里,而不是在toArray
方法中。T[]
:public static <T> T[] toArray(Iterable<? extends T> iterable, IntFunction<T[]> arraySupplier) {
return StreamSupport.stream(iterable.spliterator(), false).toArray(arraySupplier);
}
Iterable<? extends T>
是一个适当的参数类型,因为它允许您创建一个超类型的数组:
Integer[] integers = toArray(iterableOfInts, Integer[]::new);
Object[] objects = toArray(iterableOfInts, Object[]::new);
<? extends T>
而不是简单的<T>
呢? - akuzminykh? extends T
是什么意思吗?如果你用Animal[] as = toArray(some Iterable<Dog>)
或者Dog[] as = toArray(some Iterable<Animal>)
或者Dog[] as = toArray(some Iterable<Dog>)
调用这个方法会发生什么?哪一个能正常工作,为什么,而且这是我们期望的吗? - luk2302Animal[] animals = toArray(dogs)
,其中dogs
是一个List<Dog>
。这样做可能有道理,但实际上并不需要,因为数组是协变的。所以如果你将其保留为T
,你会得到一个Dog[]
,它也可以赋值给Animal[]
,因为它是协变的。因此,在这种情况下,通配符? extends T
是不必要的。 - ZabuzardT
有更多的控制权,这样做没有任何问题,尤其是如果你不是非常需要它。 - Zabuzard