( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

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をimplementsするときの型パラメータを、Class定義の型パラメータで受けるってこと。

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にするメリットはないかなぁ。