7. 適切な無検査警告の抑制
• パターン2
private Object[] elements;
Public Stack() {
elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public E pop() {
if (size == 0) {
throw new EmptyStackException();
}
E result = (E) elements[--size];
elements[size] = null;
return result;
要素を取り出すタイミングでキャ
スト
}
21. 境界ワイルドカードが必要な場
合
public interface Box<T> {
public T get();
public void put(T element);
public void put(Box<T> box);
}
Box<Number> nBox = new BoxImpl<Number>();
Box<Integer> iBox = new BoxImpl<Integer>();
nBox.put(iBox);
– Box<Number> に対する put(Box<Integer>) メソッド
が見つからない
– Integer は Number であって
も Box<Integer> は Box<Number> ではない
22. どうすればジェネリックになる
か
public interface Box<T> {
public T get();
public void put(T element);
public void put(Box<? extends T> box);
}
• ワイルドカードに上限境界を設ける
– 共変と不変(反変)との妥協案
28. 型パラメータとワイルドカード
public static <E> void swap(List<E> list, int i, int j);
public static void swap(List<?> list, int i, int j);
• どちらで定義するべきか
– 「単純で好ましい」(?)
– 「どのようなリストでも渡せる」(?)