java - Java-返回特定类型T的所有对象的集合,其中T传递给方法

原文 标签 java generics types set

我正在寻找一种方法,该方法给定原始集合A,类型T返回一个新集合,该集合包含A中所有类型T的对象。

我已经建立了一个带有Person类及其子类ManWoman以及一个World类的测试,以容纳Person对象集。

public class World {

    public World() {
        this.people = new HashSet<Person>();
    }

    public void addPerson(Person person) {
        getAllPeople().add(person);
    }

    public void removePerson(Person person) {
        getAllPeople().remove(person);
    }

    public Set<Person> getAllPeople() {
        return people;
    }

    public <T> Set<T> getAllPeople(Class<T> cls) {
        Set<T> ItemsOfClass = new HashSet<>();
        // Incompatible type error on next line
        ItemsOfClass = getAllPeople().stream().filter(object -> object.getClass().equals(cls)).collect(Collectors.toSet());
        return ItemsOfClass;
    }

    public Set<Person> people;
}


所以我想getAllPeople(Man.class)返回一组新的Man对象。

我当前的getAllPeople实现基于以下答案:https://stackoverflow.com/a/17840541
https://stackoverflow.com/a/16727596
尽管我根本无法弄清楚它们应该如何组合在一起。

我不太擅长泛型,因此欢迎您提供任何解释/建议。

最佳答案

您有一个要收集到Stream<Person>中的Set<T>。但是Stream<Person>将产生Set<Person>

您可以将您的Person实例映射到T实例并获得一个Stream<T>

public <T> Set<T> getAllPeople(Class<T> cls) {
    Set<T> itemsOfClass = getAllPeople().stream()
              .filter(cls::isInstance)
              .map(cls::cast)
              .collect(Collectors.toSet());
    return itemsOfClass;
}


它使用cls::isInstance作为谓词来查找类cls的元素,并使用cls::cast作为映射器将元素视为T实例而不是Person实例。

相关文章:

java - java扫描仪上的NotSerializableException吗?

java - 如何使用Hibernate MySQL Maven Spring MVC显示数据库中的所有行

c# - 流利类的通用“ TThis”

python - Python函数中的类型错误

jquery - 使用类型文件上传中的名称更新div

java - 是否可以在switch语句中使用instanceof运算符?

java - 这些语句之间有什么区别吗?

java - 如何调用需要Class <T>对象作为参数的方法?

java - 嵌套Groovy泛型:内部泛型类型上的意外令牌

haskell - 无法匹配预期的IO t类型