Wicket1.4-m3ではComponentはジェネリクス化されないってよ。
Wicket 1.4でのGenerics化にて大論争 - 矢野勉のはてな日記
この件に関して、1.4-m3である程度の方針が固まった模様。
すでに皆さんが書いてますが、いまさらながら。
2008-07-16 - マイペースなプログラミング日記
Wicket 1.4-m3 で Generics の仕様変更 - まどぎわBLOG
Wicket公式より。一部のComponentを除いて型パラメータは取らないようだ。
A significant change from the earlier Wicket 1.4 milestone versions is that Component is no longer generified. This means that Component and most of its subclasses in Wicket do not take a class-level type parameter. Some Component subclasses remain generified, such as
* Link
* FormComponent
* Form
* many repeater components such as RefreshingView, DataView, ListView
o Item, ListItem
以前のget/setModelメソッドは、get/setDefaultModelというように、Defaultをつけたメソッドにメソッド名が変更されており、ジェネリクス化されたComponentでpublic final T getModelObject()を実装すべし、とある。
getModelの型パラメータ記述がめんどくせぇってことで、今まで通りModelの型を指定しない場合はget/setDefaultModelを使って、型を気にする場合はComponent側に T getModelObject()とかが実装されているはずなのでそれを使えってことらしい。
この方針に関しては、良いと思う。メソッド名さえ変えれば、今まで通りに書けるしね。
であれば、型パラメータ化されたget/setModelObjectはinterfaceとして切り出されているのかと思ったら、どうも何もないようだ。
Componentがジェネリクス化されているかどうかは、T get/setModel()が実装されているかどうかで判断せよってこと?
個人的には、ジェネリクス化されているかは型で判断したいけど。
こんな感じのinterfaceを用意しておいてジェネリクス化されたComponentはこのinterfaceを実装する、とかじゃダメなのかな?
public interface GenerifiedCompoent<E> { public E getModelObject(); public void setModelObject(E model); }
このinterfaceを実装するComponentは、自身の型パラメータとInterfaceの型パラメータを同じにする。
GenerifiedCompoent
public class MyComponent<T> extends Component implements GenerifiedCompoent<T>{ public T getModelObject() { return (T)getDefaultModelObject(); } public void setModelObject(T model) { setDefaultModelObject(object); } @SuppressWarnings("unchecked") public final IModel<T> getModel() { return (IModel<T>)getDefaultModel(); } public final void setModel(IModel<T> model) { setDefaultModel(model); } }
単に、get/setModelが個々のComponentに分散されているのが個人的に気持ち悪く、ジェネリクス化されたComponentに共通の何かがあればいいなと思っただけで。
IDE使う場合は、コンポーネントをnewするときに型パラメータの指定を求められるし、ComponentからModelを取得したい場合は、とりあえずgetModelって打ってみてメソッドが実装されていればそれを使うだろうし。
まぁ、あまりinterfaceにするメリットはないかなぁ。