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することなんてあんまりないんで別にいいんですけどね。