2007/11/14 Wed

やっぱりJavaは使えねぇ・・・

Filed under: プログラム — nico @ 11:44:44

てことで、久々にちょっとブチ切れたので愚痴(をい
大昔にも書いたけど、JavaのGenerics関係は本気で使えねぇ・・・orz

結局のところ、JavaのGenerics型は型情報を保持していないのが最大の問題だよなぁ、と。
いや、むしろ型情報を保持していないオブジェクトが存在するのに、アップキャストにunsafe castの警告が出るのが頭が悪いとゆーべきなんだろーか?
(言語の体系として統一が取れてないって点で、ね。)

つか今回は、もう俺の回避しようの無い面でハマってしまってどーしよーも無かったり。
期待はしないけどどーにかしろ、と>Sun。

ハマった内容はこんな感じ。
WEB関連のお仕事なのでJ2EEとJDK5を使ってWEBの開発をやってるワケなんだけど。
J2EEのクラスが軒並みGenericsサポート前の実装のままで、「型が不明な」Generics型を返してくるってゆートンでも仕様になってるんだよね・・・<現状

たとえば、こんな感じなワケだ。

public java.util.Enumeration getParameterNames()

ところが、この「java.util.Enumeration」はJDK5とかで、既に

public interface Enumeration<E>

と、Generics型になってたりするワケで。

何が悪いかっつーと、まっとうなコードを書こうとすると警告が出まくるわけだ。

Enumeration<String> e = req.getParameterNames();

とか書くと、型の安全性がどーたらと警告が出る(アップキャストなので当たり前だが)。

じゃー、明示的にcastしたろーかって事で

Enumeration<String> e =
    (Enumeration<String>)req.getParameterNames();

とか書いたとして、「unsafe cast」だっつーって警告が出るわけだ。
ぶっちゃけ、自分らでGenerics型の型情報保持しなかったくせに、実行時キャストで型チェックできねーよって警告だすってのはどーゆー神経なんだ?と。

しゃーないんで、要素に対してcastで諦めようかって考えて、

Enumeration e = req.getParameterNames();

とかやると、今度は「Enumerationはraw型だから、<type>で型指定しろ」とか警告しやがる。
J2EEがそーやって返してきてるっつーのに、俺にどーしろってんだ、ごるぁ。

ぶっちゃけ、警告なんだからいーじゃん?とか世の人は言うかも知れんけど、アホみたいにデカいプロジェクトになってくると、警告の理由が判って対処可能な警告は対処しておかないと、本当にヤバい警告が発見できなかったり、後で「この警告なんだっけ?」と延々さまよったりと良い事なんてまったく無いんだよね。
だから、警告は対処するべきなんだけど。
ってゆーか、そもそも仕事なんだから保証できないコード(コンパイラが警告を出す=その部分で想定外の動作が起こる可能性があるって事だ)は書くべきではないワケだし。

でまぁ、グチグチ書いておいて、ホントは対処方法判ってるんだろ?とか言われるとアレなので、一応、コンパイラが警告を出さないってレベルの対処方法は書いておくけど。

Enumeration<?> e = req.getParameterNames();

こんな感じ。
型指定にワイルドカード使って、取り合えず警告でなくしたダケ。
これだと、結局Enumerationが返すオブジェクトの型が保証されないので、値を取り出すときに毎回毎回、

String str = (String)e.nextElement();

とか書いて、取り出すデータの型の安全性を検証しないと駄目。

ぶっちゃけ、何の為のGenericsなんだか・・・。
まぁ、最近よーやっとわかってきたのは、JavaのGenericsは単純にcastを暗黙化するだけのシロモノでしかないって事で、恐らくSunの中の人は「Genericsなんてイラネ」とか内心思ってるに違いないって事だな。
マヂツカエネ。

#まぁ、そもそもがJ2EEが型不明なGenerics型を返すなよボケって話なワケだが。
#ちょっと後方互換性とかゆー自分で作ったぬるま湯に浸かり過ぎだろ。

コメント (1) »

  1. Enumeration の Generics 対応(raw…

    変更前 Enumeration e = request.getParameterNames() ; 変更後 Enumeration e = request.getPa (more…)

    トラックバック by shibatimaの日記 — 2007/11/28 Wed @ 13:18:01

コメント RSS トラックバック URL

コメントをどうぞ

Link Free. Copyright (C) 2005-2007 nico. All rights reserved.
HTML convert time: 0.648 sec. Powered by WordPress ME