[英]guice binding type to unknown type but matching type
我正在嘗試從屬性Map綁定一堆類型,其中Key的類型為String,並且映射中的值的類型為String,Boolean,Int,Long等,甚至某種類型的對象。
這在scala中,但對java也一樣
class GuiceFlagsModule(
flags: Map[String, Any])
extends AbstractModule
with Logging {
def configure() {
for ((flagName, flag) <- flags) {
debug("Binding flag: " + flagName + " = " + flag)
val key2 = Key.get(value.getClass, new FlagImpl(flagName))
binder.bind(key2).toInstance(value)
}
}
}
最后一行不編譯
binder.bind(key2).toInstance(value)
我怎樣才能編譯它以便正確地綁定泛型?
我只是在Java中嘗試過,它似乎可以在intellij中工作,但是在javac編譯器上卻失敗了:(。
public void tryMe(Object someObj) {
Binder b = null;
Key k = Key.get(someObj.getClass(), new FlagImpl("name"));
b.bind(k).toInstance(someObj);
}
那么如何在Java或Scala中做到這一點呢?
我設法讓它像這樣在Java中工作
public static void bind(Binder binder, String flagName, Object value) {
Key<Object> key = Key.get((Class) value.getClass(), new FlagImpl(flagName));
binder.bind(key).toInstance(value);
}
我仍然沒有在Scala中工作
謝謝,院長
您需要確保Key<T>
的類型參數與value
的類型匹配。
壞消息是:至少在一般情況下,我不知道有任何安全的方法可以做到這一點。 好消息是,使用未經檢查的演員表即可輕松完成此操作。 我不太清楚Scala可以肯定地說,但是在Java中,我會這樣寫:
public static <T> void bind(Binder binder, String flagName, T value) {
@SuppressWarnings("unchecked")
Class<T> valueClass = (Class) value.getClass();
Key<T> key = Key.get(valueClass, new FlagImpl(flagName));
binder.bind(key).toInstance(value);
}
不幸的是,由於類型擦除(還有什么?), getClass()
不會像您想的那樣返回Class<T>
,所以需要未經檢查的強制類型轉換。
如果您知道value
的類型,那么會更容易:
public static <T> void bind(
Binder binder, String flagName, Class<T> valueClass, T value) {
Key<T> key = Key.get(valueClass, new FlagImpl(flagName));
binder.bind(key).toInstance(value);
}
但這當然只是將問題推給了呼叫者。
發布的解決方案不適用於我:
public static void bind(Binder binder, String flagName, Object value) {
Key<Object> key = Key.get((Class) value.getClass(), new FlagImpl(flagName));
binder.bind(key).toInstance(value);
}
這會將所有內容綁定到java.lang.Class對象。 但是,這可行:
Class impl = ...
Class intrf = ...
binder.bind(intrf).to(impl);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.