我正在尝试编写一个默认返回集合的泛型类,但如果调用函数需要特定的类型,例如List或Set,则该方法应该能够产生它。这可能在java?如果我没有正确地做到这一点,请纠正我。
public <U extends Collection> U saveOrUpdate(Iterable<T> entities, Class<U> klass) {
Iterable<T> savedEntities = this.repository.save(entities);
Type type = klass.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) type;
if (pt.getTypeName().equalsIgnoreCase(Set.class.getName())) {
return StreamSupport.stream(savedEntities.spliterator(), false)
.collect(Collectors.toSet());
} else if (pt.getTypeName().equalsIgnoreCase(List.class.getName())) {
return StreamSupport.stream(savedEntities.spliterator(), false)
.collect(Collectors.toList());
} else {
return StreamSupport.stream(savedEntities.spliterator(), false)
.collect(Collectors.toCollection());
}
}
答案 0 :(得分:5)
我不认为你的方法有一个类型安全的解决方案 - 你可以将返回的集合转换为U
,我猜......
如果你传递Class
的{{1}},那么传递Supplier
会不会更容易?
Collectors#toCollection
然后你可以完全控制结果类型,例如:
public <U extends Collection<T>> U saveOrUpdate(Iterable<T> entities, Supplier<U> supplier) {
Iterable<T> savedEntities = this.repository.save(entities);
return StreamSupport.stream(savedEntities.spliterator(), false)
.collect(Collectors.toCollection(supplier));
}
它甚至可以打字。