返回基于传递给参数

时间:2016-05-14 07:10:50

标签: 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());
    }
}

1 个答案:

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

它甚至可以打字。