ローカル変数の型 #3
微妙なことかもしれませんが、ローカル変数を抽象型で宣言する利点があります。
例えば、List<String> list = new ArraysList<String>(); 以下色々な処理として、プログラムを書いていけば、速度よりもメモリ効率が優先したくなったら
List<String> list = new LinkedList<String>(); 以下色々な処理と少し書き直すだけでよく、別の実装を試すことができます。
具体的な型でプログラムをかけば、よりたくさんのメソッドが使えるという利点があるのは納得ですが、結局使わなければ意味がありません。
ローカル変数宣言の変更コストなんて微々たるもので new しているクラスの変更と同時に変更すれば良い。だから「具象型で宣言しても問題がない」という話。というか「使わなければ意味がない」ってそのとおりだけど「変更しなけりゃ意味がない」って話でもある。結局メソッド内の変更に閉じるわけだし。
無条件にアップキャストするべきではないという意見には賛成で、アップキャストすべきかどうかは、使いたいオブジェクトがなんなのかを明確にして、それにあったオブジェクトを使うべきではないでしょうか。
一般的な指針としてはこれですね。付け加えるなら add と contains しか使っていないから Collection と宣言するのが適切かと言えばそうでもないとか。つまり型はインターフェース以外のことも語っていたりするという。