gpt4 book ai didi

java-8 - 返回泛型类型,它是基于传递给参数的类型的特定集合

转载 作者:行者123 更新时间:2023-12-05 00:55:56 26 4
gpt4 key购买 nike

我正在尝试编写一个默认情况下返回一个集合的泛型类,但如果调用函数需要特定类型,例如 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com