ソートされたコレクションを実装していると仮定します(単純な例-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"));
上記の3行目は。をスローしClassCastException
ます。私が欲しいものではありません。私はそれが戻ってくることを望みますfalse
(HashSet
そうです)。
例外をキャッチしてfalseを返すことで、この動作を得ることができます。
@Override
public boolean contains(Object key) {
try {
return Arrays.binarySearch(array, key, comparator) >= 0;
} catch (ClassCastException e) {
return false;
}
}
source
コレクションが正しく入力されていると仮定すると、これを行うと何がうまくいかない可能性がありますか?