Javaにおいてパラメータ化された型は不変です.
例えば,List<Integer> は List<Object> の下位型ではありません.
このような「不変」であるという性質は,ソフトウェアの柔軟性を損なう原因になり得ます.
Javaでは,この問題点を解決するため
という2つの言語仕様があります.
時として,これら2つのどちらを使えばいいのか悩む場合があります.
そこで指針の1つになるのが,
- Get & Put 戦略
です.
構造から値を取得する(get)だけの場合には extends ワイルドカードを使い,構造の中に値を格納する(put)だけの場合にはsuperワイルドカードを使い,そして両方を行う場合にはワイルドカードを使ってはいけません.
これと同様の意図として,PESCがあります.
PECSは,プロデューサー(producer)-extends,コンシューマー(consumer)-super を表しています.
これらが主張する内容を反映すれば,
スタックへの追加,削除は以下のようになるはずです.
void addAll(Iterator<? extends T> iter) void removeAll(Iterator<? super T> iter)
だからです.