Genericsで戻り値を代入する変数の型によるパラメタライズ
さっきひがさんのエントリをみてちょっと驚いた。
S2TigerにSingletonS2Containerを追加しました。キャスト無しでコンポーネントを取得できるようになります。
Hoge hoge = SingletonS2Container.getComponent(Hoge.class);
Hoge hoge2 = SingletonS2Container.getComponent("hoge");
2007-01-26 - ひがやすを blog
2つ目のhoge2のときって、型をどうやって指定してるのか?って。
で、思いついてちょっと試してみたらできた。
戻り値を代入する変数の型によって、パラメタライズできるなんて...。
そうか...こういうことができるのか...。すごい。
package hoge; import junit.framework.TestCase; public class 戻り値を受け取る変数の型によって戻り値の型が決定される extends TestCase { public void testHoge() { String foo = getFoo("ほげ"); System.out.println(foo); System.out.println(foo.getClass()); Integer bar = getFoo(new Integer(100)); System.out.println(bar); System.out.println(bar.getClass()); } private <T> T getFoo(Object obj) { return (T) obj; } }
Tからクラス名を取れたりすると、
Hoge hoge3 = SingletonS2Container.getComponent();
と書けたりする可能性もありますが、JavaのGenericsだと無理なんですよねぇ。
まあ、1つの型に対して複数のコンポーネントが存在する場合はどちらにしろ、コンポーネント名の指定は省略できませんが。
とかなんとかいって、実際にはコンテナから直接Getすることなんてあんまりないんで別にいいんですけどね。