Ben,
I think my explanation was confusing. Let me try to explain it better. I am
getting class names from some configuration files. So basically I have a
list of Class objects. I want to create bindings from List<each of thouse
classes> to some providers of these lists (or instances, it does not really
matter).
For example if I have configuration with class names:
java.lang.Integer, java.lang.String, java.lang.Long then the bindings should
be equivalent to the following:
bind(new TypyLiteral<List<Integer>>() {}).to(provider of List<Integer>)
bind(new TypyLiteral<List<String>>() {}).to(provider of List<String>)
bind(new TypyLiteral<List<Long>>() {}).to(provider of List<Long>)
so that if I have a class:
class A {
@Inject
A(List<String> strings, List<Integer> ints) {}
}
then the right list is injected into the constructor.
the problem is that those configurations are known at runtime and I have to
construct the bindings at runtime as well. I don't know the types at compile
times and I cannot create those bindings statically in the code.
Any ideas how to do that?
Thanks!
On Thu, Jul 9, 2009 at 7:35 PM, Ben <[email protected]> wrote:
>
>
> On Thu, Jul 9, 2009 at 6:32 PM, Ben <[email protected]> wrote:
>
>> I guess a common advice is to stay away from .toInstance().
>>
>> But assuming you have to do that (maybe it's a test), I would do it this
>> way to avoid messing with reflection directly:
>> abstract class ListModule<T> extends AbstractModule {
>>
>> protected ListModule(List<T> list) {
>> this.list = list;
>> }
>>
>> @Provides List<T> provideList() {
>> return list;
>> }
>> }
>>
>> new ListModule<String>(new ArrayList<String>()) {};
>>
>> FeedBurner has a convenience class that can be used as:
>>
>> new BindingModule<List<String>>(Lists.newArrayList()) {};
>>
>
> Oops. I thought this is another list. Please ignore this part, it's
> irrelevant.
>
>
>>
>>
>> On Thu, Jul 9, 2009 at 4:39 PM, Dmitry Skavish <[email protected]> wrote:
>>
>>> Hi,
>>> I can't figure out how to bind class parametrized with a given Class?
>>>
>>> For example if I have something like this:
>>>
>>> Module createModule(Class clazz, List list) {
>>> return new AbstractModule() {
>>> protected void configure() {
>>> bind(??????).toInstance(list);
>>> }
>>> };
>>> }
>>>
>>> then after this call: createModule(String.class, new ArrayList())
>>>
>>> I have binding from List<String> to my list
>>>
>>> This binding should be equivalent to this one: bind(new
>>> TypeLiteral<List<String>>() {}).toInstance(list);
>>>
>>> I tried to the following, but compiler does not like it and I am not
>>> really sure this is the right way:
>>>
>>> bind(Key.get(Types.newParameterizedType(List.class,
>>> clazz))).toInstance(list);
>>>
>>> Thanks!
>>> --
>>> Dmitry Skavish
>>>
>>>
>>>
>>
>
> >
>
--
Dmitry Skavish
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---