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の概要に書かれている。