Java中的WildCard Capture

时间:2016-05-16 18:19:04

标签: java

我有以下两种方法可以过滤掉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;
} 

1 个答案:

答案 0 :(得分:1)

您的代码中存在逻辑问题。您定义destinationCollection可以保存类型的实例,这些子类型由T保存。因此,我们无法保证您可以在T内存储destinationCollection(假设ArrayList<Pug>Dog无法容纳Pug extends Dog。我认为你真正想要的是? super T而不是? extends T