Generic type付きインスタンスのインジェクション
Generic type付きインスタンスをインジェクションするには、TypeLiteralを使用します。
インジェクション先:
import java.util.List; import com.google.inject.Inject; import com.google.inject.Singleton; class Kitten { // Generic type付きのListを受け取る。 @Inject List<String> friends; public void listFriends () { for ( String friend : friends ) { System.out.println( friend ); } } }
メイン:
Injector injector = Guice.createInjector( new AbstractModule() { @Override protected void configure ( ) { // Generic type付きのインスタンス List<String> friends = Arrays.asList( new String[] { "kuro", "mii", "tora" }); // TypeLiteralを指定して関連づけ TypeLiteral<List<String>> tl = new TypeLiteral<List<String>>() {}; bind( tl ).toInstance( friends ); } }); injector.getInstance( Kitten.class ).listFriends();
出力:
kuro mii tora
Generic typeが違うListを登録してもインジェクションされません。
メイン:
Injector injector = Guice.createInjector( new AbstractModule() { @Override protected void configure ( ) { List<Object> friends = Arrays.asList( new Object[] { "shiro" }); TypeLiteral<List<Object>> tl = new TypeLiteral<List<Object>>() {}; bind( tl ).toInstance( friends ); } }); // TypeLiteral<List<String>> のものはないため、エラーとなる。 injector.getInstance( Kitten.class ).listFriends();
出力:
Exception in thread "main" com.google.inject.ConfigurationException: Error at guice.typeliteral.Kitten.friends(Kitten.java:8) Binding to java.util.List<java.lang.String> not found. No bindings to that type were found. at com.google.inject.BinderImpl$RuntimeErrorHandler.handle(BinderImpl.java:426) at com.google.inject.AbstractErrorHandler.handle(AbstractErrorHandler.java:30) at com.google.inject.ErrorMessages.handleMissingBinding(ErrorMessages.java:46) ...