Guiceでジェネリクス型をインジェクションする方法

関連1: 分からない!ジェネリクス
関連2: Java VMとコンパイラ、型システム

この数日、Guiceジェネリクス型をインジェクションできない問題について考えていた。解決の糸口としてコンパイラJVM、型について調べていたのだが、どうやらTypeLiteralというGuiceのクラスを使うことで解決するようだ。

public static void main(String[] args) {
	Injector injector = Guice.createInjector(new AbstractModule() {
		
		@Override
		protected void configure() {
			List<String> list = new ArrayList<String>();
			list.add("AAA");
			list.add("BBB");

                        // これ
			bind(new TypeLiteral<List<String>>(){}).toInstance(list);
		}
	});
	injector.getInstance(Hoge.class).hoge();
}

ジェネリクス型のクラスインスタンスを取得する方法がJavaでは提供されていないので、実行時に強制的にサブクラスを作って型情報を取得する、とJavadocの概要に書かれている。