簡體   English   中英

guice綁定類型為未知類型但匹配類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM