java - Java 中的通配符捕获

标签 java

我有以下两种方法,旨在过滤掉 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/

相关文章:

java - Liferay 服务器无法在 Windows 上启动

java - 当某些组为空时 ExpandableListView 崩溃

java - 如何使用 For 循环获取 Java 中的用户输入?

java - 为什么将 Scala 伴随对象编译成两个类(Java 和 .NET 编译器)?

java - CYK算法伪代码混淆

java - AsyncTask 不使用 BaseAdpter 创建 GridView

java - Infinispan 不会将缓存实体删除复制到非协调器节点

java - 适用于 Android 的 Dagger : Injecting an Activity to the object graph after calling setContentView

java - 在多线程环境中并行执行每个子任务

java - 如何从新对象实例方法声明(嵌套)返回值?