捕获C extends Collection <r> </r>中使用的集合类型

时间:2014-04-08 11:50:03

标签: java generics

我正在尝试简化我的一个方法,它使用了一些Java 8,但不需要使用它:

public <T, U, R> Collection<R> singleCollectionOf(final Collection<T> collectionA, final Collection<U> collectionB, final Supplier<Collection<R>> supplier, final BiFunction<T, U, R> mapper) {
    if (Objects.requireNonNull(collectionA).size() != Objects.requireNonNull(collectionB).size()) {
        throw new IllegalArgumentException();
    }
    Objects.requireNonNull(supplier);
    Objects.requireNonNull(mapper);
    Iterator<T> iteratorA = collectionA.iterator();
    Iterator<U> iteratorB = collectionB.iterator();
    Collection<R> returnCollection = supplier.get();
    while (iteratorA.hasNext() && iteratorB.hasNext()) {
        returnCollection.add(mapper.apply(iteratorA.next(), iteratorB.next()));
    }
    return returnCollection;
}

现在您在这里看到我需要提供Supplier<Collection<R>>才能创建生成的集合。

有没有办法捕获,当且仅当collectionA的集合类型等于collectionB已使用的集合类型时,并减少提供自定义的需要供货商?

我希望能够像伪代码一样调用它:

singleCollectionOf(ArrayList<T>, ArrayList<U>, BiFunction<T, U, R>);

然后它需要能够提供ArrayList::new本身作为供应商。

这可能吗?有两种方法可以找出实际对象的类型,而不是引用类型,如果两者都是ArrayList,但是存储了List引用?

澄清示例:

List<T> list1 = new ArrayList<>();
List<U> list2 = new ArrayList<>();
singleCollectionOf(list1, list2, ...);

0 个答案:

没有答案