тип привязки к неизвестному типу, но соответствующий тип

1

Я пытаюсь связать кучу типов со свойствами 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

спасибо, Дин

Теги:
guice

2 ответа

1

Вы должны убедиться, что параметр типа 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);
}

Но это, конечно, просто подталкивает проблему к вызывающему.

0

Опубликованное решение не сработало для меня:

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню