如何将一种类型的集合转换为另一种类型的集合?

时间:2014-09-18 08:27:31

标签: java collections casting

我想将现有集合的添加限制为某种类型的元素。 Type与现有的元素类型兼容,它是它的子类。所以,我想排除一些被添加到集合中的超类类型。

如何做到这一点?

我不想将元素从一个集合转移到另一个集合,我想创建表示。

当然我可以自己创建表示类。但我想知道是否已经存在于公共图书馆或其他地方?

1 个答案:

答案 0 :(得分:0)

您想要一个更为通用的限制集合支持,允许将修改传递给原始类:

    Set<Number> numbers = new HashSet<>();
    Collections.addAll(numbers, 23, 0.3, new BigDecimal("3.254"), 0.1f);
    SubCollection<Number, Integer> integers = new SubCollection<>(numbers);
    integers.add(4);
    //integers.add(3.4); // No longer allowed

/**
 * @param B the element type of the original collection.
 * @param T the element type of this collection.
 */
public class SubCollection<B, T extends B> implements Collection<T> {

    final Collection<B> collection;

    SubCollection(Collection<B> collection) {
        this.collection = collection;
    }

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

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

    @Override
    public boolean contains(Object o) {
        return collection.contains(o);
    }

    @Override
    public Iterator<T> iterator() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Object[] toArray() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public <T> T[] toArray(T[] ts) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean add(T e) {
        return collection.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return collection.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> clctn) {
        return collection.containsAll(clctn);
    }

    @Override
    public boolean addAll(Collection<? extends T> clctn) {
        return collection.addAll(clctn);
    }

    @Override
    public boolean removeAll(Collection<?> clctn) {
        return collection.removeAll(clctn);
    }

    @Override
    public boolean retainAll(Collection<?> clctn) {
        return collection.retainAll(clctn);
    }

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

用于指定add被限制(到整数)的代码很多。

如果没有修改 Java 8 及其,请将其简化。