そろそろ

なんか入院したり引越ししたりでアレだったのだけど、ちょっとだけ書いておく。

だれもそんなぶっ飛んだ論法は使っていないと思うのだけど。というか、そもそもだれも、「絶対に抽象型で宣言してはいけない」という意図ではなかったと思うのだよなぁ。
なんというか「ローカル変数を具象型で宣言しても良い」は共通する認識で、私が言いたかったことは、「抽象型で宣言しておいて具象型で宣言されているメソッドを使いたくなったら、キャストするか型宣言を修正する必要がある」からローカル変数は具象型のほうがいいんじゃね、という話で、kwatch さんのは「抽象型で宣言しておくと、実装を簡単に差し替えられるし、そのことが明確になる」からローカル変数でもあえて抽象型で宣言する利点はある、ということだと思う。
で、私は抽象型で宣言した程度でそんな簡単に実装が差し替えられるとは思っていないのですよね。例えば、List で言えば、「複数のスレッドから同時にアクセスしても不整合が起きない」、「ランダムアクセスが可能」、「mutable である」、「追加可能」などなどの性質は型宣言からは読み取れないわけで。
というか、私は

List<Integer> list = new ArrayList<Integer>();

を型宣言だけ見て

List<Integer> list = new LinkedList<Integer>();

に書き換え可能だとは判断しないし、するべきではないと考える。実際問題 RandomAccess を要求するような前者のように宣言しても全く問題なく動くし、テストも通るわけで。結局、最低限メソッドのコードには目を通してからでないと実装の変更なんて怖くてできない。
あと、メソッドパラメータとしての List 型のオブジェクトにはできるだけ型以上の前提はおかないほうが良いが、ローカル変数での List 型のオブジェクトには型から得られる以上の前提を置くのはかまわないというのが私のスタンスなので、その辺が違うのではないかなぁ。