我有以下两种方法可以过滤掉Collection中作为某个Class实例的元素。第一种方法编译好,而第二种方法不编译。
从第一种方法到第二种方法的唯一变化是输出集合的泛型类型定义。
我想知道为什么第二种方法不能编译,因为据我所知它似乎执行安全操作。可以使用辅助方法吗?如果是,应该如何编码?。
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;
}
答案 0 :(得分:1)
您的代码中存在逻辑问题。您定义destinationCollection
可以保存类型的实例,这些子类型由T
保存。因此,我们无法保证您可以在T
内存储destinationCollection
(假设ArrayList<Pug>
,Dog
无法容纳Pug extends Dog
。我认为你真正想要的是? super T
而不是? extends T
。