2014-11-06 3 views
0

Можно ли связать динамически общий тип в Guice?Тип Guice Literal Bindings

Я знаю, что это можно сделать, например:

bind(new TypeLiteral<SomeInterface<String>>(){}) 
    .to(SomeImplementation.class); 

Но можно создать TypeLiteral ??? динамически , Я хочу иметь в виду, что в примере, который я знаю, чтобы требовать от SomeInterface к SomeImplementation ..... но как насчет того, если я хочу сделать это динамически ...

Например, если у меня есть String1, String2, .... Строка «п» ... можно сделать функцию, аналогичную как этот псевдокод

function (Class<?> interfaceWithoutType, Clas<?> type , Class<?> implementingClass) { 
     TypeLiteral typeLiteral = **"createTypeLiteral"** (interfaceWithoutType, type); 
     bind (typeLiteral).to(implementingClass) 
    } 

можно ли сделать что-то подобное, возможно, с Refections? Спасибо.

ответ

3

должно работать, хотя я не тест-скомпилирован:

private <T> void bindSomeInterface(Class<T> typeParameter, Class<? extends SomeInterface<T>> implementation) { 
    Type parameterizedType = Types.newParameterizedType(SomeInterface.class, typeParameter); 
    bind((TypeLiteral<SomeInterface<T>>) TypeLiteral.get(parameterizedType)) 
      .to(implementation); 
} 

Но я бы рекомендовал просто делать это вручную вместо этого.