無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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)
	...