簡短回答:綁定到Object實例的bind()方法應該與類< Object>參數一起提供。 這就是說:Guice - 如何綁定程序運行時確定的類型?
Class<?> type = got_a_type(); Object object = got_an_object();
// Illegal - compilation error because of type check comparing ? to Object
bind(type).toInstance(object);
// Legal and working
bind((Class<Object>)type).toInstance(object);
很長的故事:
我在下面的格式從舊系統中的JSON配置文件:
{
"$type": "test_config.DummyParams",
"$object": {
"stringParam": "This is a string",
"integerParam": 1234,
"booleanParam": false
}
}
的test_config.DummyParams程序中是可用的類運行時,看起來像這樣:
package test_config;
public class DummyParams {
public String stringParam;
public int integerParam;
public boolean booleanParam;
}
There的一些類,我想通過其爲具有構造函數的參數吉斯創建(需要注入)DummyParams類型:
@Inject
public class DummyService(DummyParams params) { ... }
現在,由於DummyParams類是僅在運行時提供的東西(通過JSON配置文件),不能在編譯的時候知道我不能使用這種類型的吉斯綁定:
// Can't do this because DummyParams type should come from config file
Object object = ...; // Getting object somehow
bind(DummyParams.class).toInstance((DummyParams)object);
我有一些舊的代碼,這使我對讀取類和對象(類和實例)的所有json配置文件:
class ConfigObject {
Class<?> type;
Object instance;
}
我試圖簡單地將它們綁定:
ConfigObject obj = config.read(); // Getting pairs from config files walker
bind(obj.type).toInstance(obj.instance);
但是,這並不編譯:「Java的:在com.google.inject.binder.LinkedBindingBuilder toInstance(?捕獲#189)不能被應用到(java.lang.Object中)」。
所以,這裏有一個問題:如何綁定在運行時確定的類型的實例?我打破IoC的概念,並且正在做我想做的事情嗎?