短い答え: Object インスタンスにバインドするには、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;
}
DummyParams タイプのコンストラクターパラメーター (注入する必要がある) を持つ Guice によって作成したいクラスがあります。
@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);
しかし、これはコンパイルできません。
ここで質問があります: ランタイムで決定される型のインスタンスをバインドする方法は? 私は IoC の概念を破っており、私がやろうとしていることをすべきでしょうか?