2016-12-28 7 views
1

Примечание: несмотря на аналогичное имя, ответ Dynamically bind instances using guice не может решить мою проблему, так как мне нужны все инъекции, непосредственно впрыскиваемые, а не на карту.Синхронизировать экземпляры в Guice

У меня есть набор пар Class -> экземпляры. Они хранятся в файле Guava ClassToInstanceMap. Я хочу передать ClassToInstanceMap своим обычным Module и пропустить каждую запись, чтобы выполнить фактическое привязку. Как мне это сделать?

import com.google.common.collect.ImmutableClassToInstanceMap; 
import com.google.inject.AbstractModule; 
import com.google.inject.Module; 

public class InstanceModuleBuilder { 
    private final ImmutableClassToInstanceMap.Builder<Object> instancesBuilder = ImmutableClassToInstanceMap.builder(); 
    public <T> InstanceModuleBuilder bind(Class<T> type, T instance) { 
    instancesBuilder.put(type, instance); 
    return this; 
    } 
    public Module build() { 
    return new InstanceModule(instancesBuilder.build()); 
    } 
    static class InstanceModule extends AbstractModule { 
    private final ImmutableClassToInstanceMap<Object> instances; 
    InstanceModule(ImmutableClassToInstanceMap<Object> instances) { 
     this.instances = instances; 
    } 
    @Override protected void configure() { 
     for (Class<?> type : instances.keySet()) { 
     bind(type).toInstance(instances.getInstance(type)); // Line with error 
     } 
    } 
    } 
} 

Когда я компилировать код выше, я получаю следующее сообщение об ошибке:

InstanceModuleBuilder.java:[38,52] incompatible types: inference variable T has incompatible bounds 
    equality constraints: capture#1 of ? 
    upper bounds: capture#2 of ?,java.lang.Object 

Я также попытался следующие привязок:

for (Map.Entry<? extends Object,Object> e: instances.entrySet()) { 
    bind(e.getKey()).toInstance(e.getValue()); 
} 

Или

for (Map.Entry<? extends Object,Object> e: instances.entrySet()) { 
    bind(e.getKey()).toInstance(e.getKey().cast(e.getValue())); 
} 

Но никто не компилируется.

ответ

2

Я избавилась от дженериков, и она работала:

@Override protected void configure() { 
     for (Class type : instances.keySet()) { 
     bind(type).toInstance(instances.getInstance(type)); 
     } 
    }