悪戦苦闘・その2
長くなったので2分割~。
つか、殆ど愚痴だし、技術的(或いは学術的)内容で誰も付いてきていない予感・・・。
まぁ・・・今月夏休みとってずーっと寝てたり(をい)したせいで、あんまり更新してなかったんで、多少まとめて書こうとか・・・そーゆー意図があったりなかったりするのはナイショだw
で、今回ハマったのは、Javaのジェネリック。
ジェネリックっつーのは、何かって、簡単にぶっちゃけると、データ型と処理を分離する概念。
こーいっちゃうと「それ、オブジェクト指向から退化してないかい?」って話が出てくる(実際、逆行した流れだと批判する向きもある)けど、実際にはちょっと発展させた概念ですな。
なんでそんな概念と機能が必要なのかっつーと、単純に「オブジェクトが自分がどうなるかの振る舞いを知っている」って考え方だと、オブジェクトの集合とか、プログラムで本気でよく現れるケースに対して、全てのオブジェクトに対して全て真っ向勝負する必要があって、非効率だって話があるワケですな。
で、ソレを効率的に書こうとすると、今度はダウンキャストってゆー、ある意味オブジェクト指向の弊害みたいな醜悪な(そしてバグの巣窟な)手法をやっていかなければならないワケで。
(よーするに、何かわからないものを突っ込む箱を用意して、取り出したモノを使いたい物と過程してキャスト(=ダウンキャスト)するって方法ね)
そんなこんなで、
1.任意の型に対して特定の処理のまとまりを用意したい
2.タイプセーフでなければならない
等の要因が合わさって、ジェネリック(C++ではテンプレート)ってのが必要ってワケですな。
ツマリは、オブジェクト指向ありきな概念であって、決して逆行してるワケではないですよ・・・と。
で、だ。
Javaで何がハマったかっつーと、コレが出来ない。
public T alloc() {
return new T();
}
}
いやもー、何で出来ないのか俺にはさっぱり理解できないんですが、Javaのお偉いさんの言うことには
「Javaのタイプネームはクラス情報を含まないのでTのコンストラクタが不明だから出来ない」
って事ですわ。
なんかムツカシイ事言ってるんで勝手に要約すると、
「過去のJVMとの互換性とかも含めて実装したら、サポートできなかったの、てへ」
って事らしい。
あーほーかー。
ジェネリックサポートを使ってビルドしたclassを実行するにはJVMいくつ以降が必要とかってゆー、そーゆー事は出来んかったのかー!?
なんかもう、ボクJavaと付き合うの疲れました・・・orz
あー・・・とりあえず、「なんでAllocaterみたいなのが要るの?newでいんじゃね?」ってヒトも要るだろうから、なんでコレが欲しかったのか軽く説明を。
xmlだとフツーにこーゆー記述が出来るワケですわ。
<root>
<class>
<student>
<name>Taro</name>
</student>
<student>
<name>Hanako</name>
</student>
</class>
</root>
で、このStudentみたいに、特定のデータの塊がリスト状になってるって形式はあまりに当たり前に存在するので、共通ロジックでサポートしたかったのね?
ある関数を呼び出すと、Studentクラスの配列がごっそり帰ってくる、みたいな感じで。
ところが、ソレを実装するにはその関数内部でStudentクラスのインスタンスを生成する必要があるワケだけど、ソレを行うには関数にStudentクラスのインスタンスを生成する為の情報が無ければならない。
てことで、Studentクラス専用にハードコーディングするなら簡単だけど、任意のクラス相手だと・・・ってことでジェネリックで解決したかったんだけどねぇ・・・。
てことで、
こんな感じでインスタンス生成用クラスを渡したかったのよ。
加えて言うなら、わざわざAllocaterを使いたかったのは、クラスの生成/初期化がデフォルトでnewするだけではまかなえない時に、Allocaterから派生した独自クラス作れば、どーとでもなるので。
ソレ考えなければ、
public <T> T Load() {
T ret = new T();
}
}
が出来ればいーんだけど。
まぁ、どっちにせよ同じ理由で使えなかったんだけどね・・・orz
トラックバック URL :