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

时间:2018-05-21 14:57:39

标签: java generics types set

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

我已经使用Person类及其子类ManWoman设置了测试,并设置了World类以容纳Person类{1}}对象。

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
虽然我无法弄清楚它们应该如何组合在一起,如果有的话。

我不擅长仿制药,所以欢迎所有的解释/建议。

1 个答案:

答案 0 :(得分:0)

您要将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作为谓词来查找类clscls::cast的元素作为映射器,将您的元素视为T个实例而不是{{1实例。