ローカル変数の型を明示しないといけない理由はあるのか?

そのSICPで「さ」さんとAさんが型を明示する必要があるとかないとか議論してたネタ。
どうもハタから見て食い違いがあるのでよく整理してみると、両者ともメソッド定義の型指定は有意義だと。Aさんはローカル変数の型の指定がアホらしいと。
ぼくも、ローカル変数はコーディング上の都合で必要なだけなので、変数名にsとかiとか使ったり虐げられてもいいという考え方です。
たとえば

Image im1 = Tookkit.getDefaultToolkit().createImage(・・・・・);
Image im2 = Tookkit.getDefaultToolkit().createImage(・・・・・);

がうっとおしいから

Toolkit tk = Toolkit.getDefaultToolkit();
Image im1 = tk.createImage(・・・・・);
Image im2 = tk.createImage(・・・・・);

とするとか、コーディング上の都合であって、このローカル変数tkは特別な意味を持ちません。
それだったら

var tk = Toolkit.getDefaultToolkit();
Image im1 = tk.createImage(・・・・・);
Image im2 = tk.createImage(・・・・・);

でもいいじゃないか、と。型くらい勝手に推測してくれ、と。
特にAさんの主張としては「Toolkitとか長ったらしいこと2回書きたくないんじゃ!」ってことです。

JFormattedTextField ftf = new JFormattedTextField();

とか。オブジェクト型のローカル変数は、勝手に型を決めてくれてもいいんじゃないかと。

var ftf = new JFormattedTextField();

でいいじゃないかと。みりゃわかるだろ、バカと。
基本型は

int i = new int(a);

のように同じものを左と右に2回書くということはあまりないのと、それより動作として副作用があるのでナシです。
オブジェクト型は変数の型がなんであっても実際のオブジェクトの型には影響がないので実行に影響を与えないのですが、基本型は変数の型によって実行時の型が決まるので、オブジェクト型の場合よりも変数の型指定というのが大切になります。
オブジェクト型であれば、コンパイルさえ通ればローカル変数の型はなんであってもかまわないのです。
とにかく、右と左に同じものを長ったらしく書かないといけないのはバカらしいのです。