2016-12-28 5 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 
     } 
    } 
    } 
} 

、私は次のエラーを取得する:

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())); 
} 

しかし:

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 

は、私はまた、次のバインディングを試してみましたなしコンパイル。

答えて

2

私はジェネリックを処分したし、それが働いた:

@Override protected void configure() { 
     for (Class type : instances.keySet()) { 
     bind(type).toInstance(instances.getInstance(type)); 
     } 
    } 
関連する問題