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

Java 8 返回泛型类型,该泛型类型是基于传递给参数的类型的特定集合,java-8,Java 8,我试图编写一个泛型类,默认情况下返回一个集合,但是如果调用函数需要一个特定的类型,比如List或Set,那么该方法应该能够生成它。这在java中可能吗?如果我做得不对,请纠正我 public <U extends Collection> U saveOrUpdate(Iterable<T> entities, Class<U> klass) { Iterable<T> savedEntities = this.repository.save

我试图编写一个泛型类,默认情况下返回一个集合,但是如果调用函数需要一个特定的类型,比如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());
    }
}
public U saveOrUpdate(可编辑实体,类klass){
Iterable savedenties=this.repository.save(实体);
类型Type=klass.getClass().getGenericSuperclass();
ParameteredType pt=(ParameteredType)类型;
if(pt.getTypeName().equalsIgnoreCase(Set.class.getName())){
返回StreamSupport.stream(savedenties.spliterator(),false)
.collect(收集器.toSet());
}else if(pt.getTypeName().equalsIgnoreCase(List.class.getName())){
返回StreamSupport.stream(savedenties.spliterator(),false)
.collect(Collectors.toList());
}否则{
返回StreamSupport.stream(savedenties.spliterator(),false)
.collect(收集器.toCollection());
}
}

我认为您的方法没有类型安全的解决方案-我想您可以将返回的集合强制转换为
U

与其通过
,不如让
收集者通过
供应商
进行收集

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));
}

它甚至可以进行打字检查。

你为什么不试试呢?或者更好的是,将其作为一个独立的示例进行编译
collector.toCollection()
需要一个
Supplier
参数,顺便说一句。我试过了,但编译器在特定类型的收集器collector.toSet()和收集器.toList()上给出了错误
saveOrUpdate(entities, HashSet::new);  // constructor as Supplier