作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个默认情况下返回一个集合的泛型类,但如果调用函数需要特定类型,例如 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());
}
}
最佳答案
我认为您的方法没有类型安全的解决方案 - 您可以将返回的集合转换为 U
, 我猜...
而不是通过 Class
, 如果你传入 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));
}
saveOrUpdate(entities, HashSet::new); // constructor as Supplier
关于java-8 - 返回泛型类型,它是基于传递给参数的类型的特定集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223769/
我是一名优秀的程序员,十分优秀!