在Java中转换泛型集合的类型

在Java中转换泛型集合的类型,java,generics,collections,Java,Generics,Collections,在我的代码中有几个地方我有ArrayList和TreeSet,我希望转换它们的泛型类型。例如,我有一个ArrayList,我想把它转换成ArrayList。或者我有一个TreeSet,我想把它转换成TreeSet 所有这些转换都可以进行,但是我必须为每个类型转换创建一个不同的函数。因此,我想创建一个通用函数,其签名如下: public static <Q,T> Collection<Q> convert(Collection<T> col, Class<

在我的代码中有几个地方我有ArrayList和TreeSet,我希望转换它们的泛型类型。例如,我有一个
ArrayList
,我想把它转换成
ArrayList
。或者我有一个
TreeSet
,我想把它转换成
TreeSet

所有这些转换都可以进行,但是我必须为每个类型转换创建一个不同的函数。因此,我想创建一个通用函数,其签名如下:

public static <Q,T> Collection<Q> convert(Collection<T> col, Class<Q> Q)
公共静态集合转换(集合列,Q类)
我想要的是从
col
(例如
ArrayList
)获取类,创建该类的新集合并键入
Q
(称为
newCol
),然后遍历
col
,将
T
类型的每个元素转换为
Q
类型,并将其添加到
newCol
中,最后返回
newCol


我怎样才能做到这一点?

在Java中没有像强制转换不兼容类这样的特殊机制。您需要指定一个显式函数来执行转换。使用Java 8非常简单:

public static <Q,T,C extends Collection<Q>> C convert(Collection<T> col, Function<T, Q> fn, 
                   Supplier<C> supplier) {
    return col.stream().map(fn).collect(Collectors.toCollection(supplier));
}
公共静态C转换(收集列、函数fn、,
供应商(供应商){
返回col.stream().map(fn.collect(Collectors.toCollection(supplier));
}
像这样使用它:

TreeSet<BigInteger> values = // fill them somehow
TreeSet<String> converted = convert(values, BigInteger::toString, TreeSet::new);
    public static <F, T> Collection<T> transform(Collection<F> fromCollection, Function<? super F, T> function) {
        return new TransformedCollection<F, T>(fromCollection, function);
    }

    static class TransformedCollection<F, T> extends AbstractCollection<T> {
        final Collection<F> fromCollection;
        final Function<? super F, ? extends T> function;

        TransformedCollection(Collection<F> fromCollection, Function<? super F, ? extends T> function) {
            this.fromCollection = checkNotNull(fromCollection);
            this.function = checkNotNull(function);
        }

        @Override public void clear() {
            fromCollection.clear();
        }

        @Override public boolean isEmpty() {
            return fromCollection.isEmpty();
        }

        @Override public Iterator<T> iterator() {
            return Iterators.transform(fromCollection.iterator(), function);
        }

        @Override public int size() {
            return fromCollection.size();
        }
    }
TreeSet值=//以某种方式填充它们
TreeSet converted=转换(值,BigInteger::toString,TreeSet::new);

@Tagir Valeev是正确的。您可以在Java8中轻松地完成这项工作。但如果您使用Java 7,您可以尝试执行以下操作:

TreeSet<BigInteger> values = // fill them somehow
TreeSet<String> converted = convert(values, BigInteger::toString, TreeSet::new);
    public static <F, T> Collection<T> transform(Collection<F> fromCollection, Function<? super F, T> function) {
        return new TransformedCollection<F, T>(fromCollection, function);
    }

    static class TransformedCollection<F, T> extends AbstractCollection<T> {
        final Collection<F> fromCollection;
        final Function<? super F, ? extends T> function;

        TransformedCollection(Collection<F> fromCollection, Function<? super F, ? extends T> function) {
            this.fromCollection = checkNotNull(fromCollection);
            this.function = checkNotNull(function);
        }

        @Override public void clear() {
            fromCollection.clear();
        }

        @Override public boolean isEmpty() {
            return fromCollection.isEmpty();
        }

        @Override public Iterator<T> iterator() {
            return Iterators.transform(fromCollection.iterator(), function);
        }

        @Override public int size() {
            return fromCollection.size();
        }
    }

publicstaticcollection转换(Collection fromCollection,functionusingjava8)非常简单。你能用java8吗?