如何使用一种方法收集和返回实例,具有一个泛型类型参数?

时间:2017-03-14 11:32:17

标签: java generics

我的应用程序代表的是一个公司,它有项目(Project类)和Employees。每个Employee都是Worker,每个Leader都是Worker,每个ProjectLeaderDeveloperLeader本身就是Leader

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

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

每个项目都有一个List,代表项目中的所有工人:

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

所以我希望我的方法能够接受以下类型参数:ProjectEmployeeWorkerLeaderProjectLeader,{{ 1}}。我的方法是:

DeveloperLeader

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

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 pL1 = new ProjectLeader();

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

当使用&#34;更高级别&#34;进行调用时,如何返回每个子类实例?参数呢?我甚至不确定,我是否以正确的方式使用泛型,所以我们非常感谢任何干净的代码或使用建议!

1 个答案:

答案 0 :(得分:3)

根据您所希望的语义,这个小小的变化可能就是您想要的。

替换它:

check your email...

用这个:

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

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

虽然我们正在研究它:这是你的方法,用更惯用的Java 8风格重写

if(cls.isInstance(e))