我想将现有集合的添加限制为某种类型的元素。 Type与现有的元素类型兼容,它是它的子类。所以,我想排除一些被添加到集合中的超类类型。
如何做到这一点?
我不想将元素从一个集合转移到另一个集合,我想创建表示。
当然我可以自己创建表示类。但我想知道是否已经存在于公共图书馆或其他地方?
答案 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 及其流,请将其简化。