我的应用程序代表一家公司,该公司拥有项目(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<>();
所以我希望我的方法能够接受以下类型参数:Project
、Employee
、Worker
、Leader
、ProjectLeader
、DeveloperLeader
。我的方法是:
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)参数(Employee
,Leader
)来调用它,对于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/