java - 如何使用一种方法收集并返回具有一个泛型类型参数的实例?

标签 java generics

我的应用程序代表一家公司,该公司拥有项目(Project 类)和Employees。每个Employee都是一个Worker,每个Leader都是一个Worker,每个ProjectLeader并且 DeveloperLeader 本身就是一个 Leader

我想在 Company 类中创建一个方法,该方法接受类型参数,并返回一个包含给定类型的所有实例的 Set。公司有一个项目集,代表所有项目:

private static Set<Project> projects = new HashSet<>();

每个项目都有一个列表,代表项目中的所有 worker :

public List<Worker> workersOnProject = new ArrayList<>();

所以我希望我的方法能够接受以下类型参数:ProjectEmployeeWorkerLeaderProjectLeaderDeveloperLeader。我的方法是:

public <T> Set<T> getSameTypeEntity(Class<T> cls) {
        Set<T> sameTypeEntities = new HashSet<>();
        if (cls == com.example.project.Project.class) {
            sameTypeEntities.addAll((Collection<? extends T>) projects);
        } else {
            for (Project p : projects) {
                for (Object e : p.workersOnProject) {
                    if (e.getClass() == cls) {
                        sameTypeEntities.add((T) e);
                    }
                }
            }
        }
        return sameTypeEntities;
    }

如果我创建一个 projectLeader 实例,我会使用:

ProjectLeader pL1 = new ProjectLeader();

但是当我调用该方法时,如下所示:

getSameTypeEntity(Leader.class);
getSameTypeEntity(DeveloperLeader.class);

对于 Leader.class 参数,我的方法返回一个空的 Set,但它适用于 DeveloperLeader.class。所以我不能用父类(super class)参数(EmployeeLeader)来调用它,对于Worker.class它只返回像这样创建的实例(Worker w1 = new Worker();),但它还应该返回所有 Leader 子类型,因为它们也是 Worker

当使用“更高级别”参数调用时,如何返回每个子类实例?我什至不确定,我正在以正确的方式使用泛型,因此任何干净的代码或使用建议都会受到赞赏!

最佳答案

根据您想要的语义,这个小小的改变可能就是您想要的。

替换这个:

if (e.getClass() == cls) {

这样:

if(cls.isInstance(e))

不同之处在于,这不仅检查完全匹配,而且还允许实现指定接口(interface)的子类或类。


当我们这样做时:这是您的方法,以更惯用的 Java 8 风格重写

public <T> Set<T> getSameTypeEntity(Class<T> cls) {
    Set<T> sameTypeEntities = new HashSet<>();
    if (cls == Project.class) {
        sameTypeEntities.addAll((Collection<? extends T>) projects);
    } else {
        projects.stream()
                .flatMap(p -> p.getWorkersOnProject().stream())
                .filter(cls::isInstance)
                .map(cls::cast)
                .forEach(sameTypeEntities::add);
    }
    return sameTypeEntities;
}

关于java - 如何使用一种方法收集并返回具有一个泛型类型参数的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42784847/

相关文章:

java - 为什么我的 Com4J 界面在迭代期间挂起?

java - 如何用相同的键java对hashmap值求和

c++ - C++ 中有 "generics-like"功能吗?

c# - 为什么这不是自动推断的?

java - 如何编写带有嵌套模板参数的类?

java - 是否可以从 Hibernate Criteria 中删除订单?

java - 传递给 URL 的参数不起作用

java - linkedin 中 Http 请求中的授权 header

c# - 在提供多个集合的同时初始化通用列表? C#

java - 具有扩展 Iterable 类型的通用方法不起作用