2016-07-07 9 views
0

など。Guice AbstractModuleで@Providesメソッドを使ってジェネリック型をバインドする方法は?

public final class SomeModule<T> extends AbstractModule { 
    private final Class<T> clazz; 
    public SomeModule(Class<T> clazz) { 
    this.clazz = clazz; 
    } 

    @Provides 
    T getT(@ExternalAnnotation Any any) { 
    Any payload = asset.get().getPayload(); 
    return payload.<T>unpack(clazz); 
    } 
} 

これはエラーになります:

T cannot be used as a key; It is not fully specified. 

どちらも私は戻り値の型は、まだ型T思考のようにしたいので、TypeLiteralもキーは、ここで適切と思わ使用して?

答えて

2

タイプの消去では、Guiceはモジュールのインスタンスから十分な情報を持っていないため、バインドするタイプを判別できません。

代わりに、クラスリテラルを受け入れて使用してください。この例ではジェネリックは保持していますが、ユースケースに必要がない場合はドロップできます。

// Warning: Untested. Please revise if needed. 
public final class SomeModule<T> extends AbstractModule { 
    private Class<T> t; 

    public SomeModule(Class<T> t) { 
    this.t = t; 
    } 

    @Override 
    public void configure() { 
    // Uses a class instance rather than reflection, so this is fine. 
    bind(t).toProvider(new Provider<T>() { 
     // ... do stuff 
    }); 
    } 
} 

も参照してください:他の例に高速応答やリンクの

+0

ありがとう! –

関連する問題