突っ走り書き

見せるほどのものでは..

Get & Put戦略

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)
  • addAll において,iterは値を取得(get)される存在
  • removeAll において,iter は値をputされる存在

だからです.