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