假设我正在实现一个排序集合(简单示例 -Set
基于排序数组的一个。)考虑这个(不完整的)实现:
import java.util.*;
public class SortedArraySet<E> extends AbstractSet<E> {
@SuppressWarnings("unchecked")
public SortedArraySet(Collection<E> source, Comparator<E> comparator) {
this.comparator = (Comparator<Object>) comparator;
this.array = source.toArray();
Arrays.sort(this.array, this.comparator);
}
@Override
public boolean contains(Object key) {
return Arrays.binarySearch(array, key, comparator) >= 0;
}
private final Object[] array;
private final Comparator<Object> comparator;
}
现在让我们创建一组整数
Set<Integer> s = new SortedArraySet<Integer>(Arrays.asList(1, 2, 3), null);
并测试它是否包含一些特定的值:
System.out.println(s.contains(2));
System.out.println(s.contains(42));
System.out.println(s.contains("42"));
上面的第三行将抛出一个ClassCastException
. 不是我想要的。我希望它返回false
(就像HashSet
这样。)
我可以通过捕获异常并返回 false 来获得这种行为:
@Override
public boolean contains(Object key) {
try {
return Arrays.binarySearch(array, key, comparator) >= 0;
} catch (ClassCastException e) {
return false;
}
}
假设source
集合是正确输入的,如果我这样做会出现什么问题?