我有以下两种方法,旨在过滤掉 Collection 中作为某个类的实例的元素。第一个方法可以编译,而第二个则不行。
从第一种方法到第二种方法的唯一变化是输出集合的泛型类型定义。
我想知道为什么第二种方法无法编译,因为据我所知它似乎执行了安全操作。辅助方法有用吗?如果有用,应该如何编码?
public static <T> Collection<T> firstFilterCollection(Collection<?> sourceCollection, Class<T> classToFilter) throws InstantiationException, IllegalAccessException {
Collection<T> destinationCollection = sourceCollection.getClass().newInstance();
for (Object object : sourceCollection) {
if (classToFilter.isInstance(object)) {
T t = classToFilter.cast(object);
boolean add = destinationCollection.add(t);
}
}
return destinationCollection;
}
public static <T> Collection<? extends T> secondFilterCollection(Collection<?> sourceCollection, Class<T> classToFilter) throws InstantiationException, IllegalAccessException {
Collection<? extends T> destinationCollection = sourceCollection.getClass().newInstance();
for (Object object : sourceCollection) {
if (classToFilter.isInstance(object)) {
T t = classToFilter.cast(object);
boolean add = destinationCollection.add(t);
}
}
return destinationCollection;
}
最佳答案
您的代码中存在逻辑问题。您定义 destinationCollection
可以保存类型的实例,该类型的子类型为 T
。因此,不保证您可以存储 T
destinationCollection
内(鉴于 ArrayList<Pug>
, Dog
不能容纳 Pug extends Dog
)。我认为你真正想要的是 ? super T
而不是? extends T
.
关于java - Java 中的通配符捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37260595/