简短回答:绑定到对象实例的 bind() 方法应提供 Class<Object> 参数。那说:
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;
}
我想通过 guice 创建一些类,它具有 DummyParams 类型的构造函数参数(需要注入):
@Inject
public class DummyService(DummyParams params) { ... }
现在,由于 DummyParams 类仅在运行时提供(通过 json 配置文件)并且在编译时无法知道我不能在 guice 绑定中使用这种类型:
// 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);
但这是不可编译的:“com.google.inject.binder.LinkedBindingBuilder 中的 java:toInstance(capture#189 of ?) 不能应用于 (java.lang.Object)”。
所以这里有一个问题:如何绑定在运行时确定的类型的实例?我是否打破了 IoC 的概念并且应该做我想做的事情?