返回通用类型,它是基于传递给参数的类型的特定集合

Roh*_*pta 4 java-8

我正在尝试编写一个默认情况下返回一个集合的通用类,但是如果调用函数需要一个特定的类型(例如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());
    }
}
Run Code Online (Sandbox Code Playgroud)

sth*_*lzm 5

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

相反,传递的Class,那岂不是更容易,如果你在传递SupplierCollectors#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));
}
Run Code Online (Sandbox Code Playgroud)

然后,您将完全控制结果类型,例如:

saveOrUpdate(entities, HashSet::new);  // constructor as Supplier
Run Code Online (Sandbox Code Playgroud)

而且它甚至进行类型检查。