我的应用程序代表的是一个公司,它有项目(Project
类)和Employees
。每个Employee
都是Worker
,每个Leader
都是Worker
,每个ProjectLeader
和DeveloperLeader
本身就是Leader
。
我想在Company
类中创建一个接受类型参数的方法,并返回包含给定类型的所有实例的Set
。该公司有一个项目集,代表所有项目:
private static Set<Project> projects = new HashSet<>();
每个项目都有一个List,代表项目中的所有工人:
public List<Worker> workersOnProject = new ArrayList<>();
所以我希望我的方法能够接受以下类型参数:Project
,Employee
,Worker
,Leader
,ProjectLeader
,{{ 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.class
,Employee
)调用它,而对于Leader
它只返回像这样创建的实例(Worker.class
),但它应该还会回馈所有Leader子类型,因为它们也是Worker w1 = new Worker();
s。
当使用&#34;更高级别&#34;进行调用时,如何返回每个子类实例?参数呢?我甚至不确定,我是否以正确的方式使用泛型,所以我们非常感谢任何干净的代码或使用建议!
答案 0 :(得分:3)
根据您所希望的语义,这个小小的变化可能就是您想要的。
替换它:
check your email...
用这个:
if (e.getClass() == cls) {
不同之处在于,它不仅检查完全匹配,还允许实现指定接口的子类或类。
虽然我们正在研究它:这是你的方法,用更惯用的Java 8风格重写
if(cls.isInstance(e))