Неоднозначная перегрузка: исправить или попробовать что-то еще?
Справочная информация: я работаю над использованием scala.js/ scalatags вместе с scala.rx. То, что я пытаюсь достичь, это привязка значений из входных данных HTML для Rx Var
s, используя стиль оператора. Вот что я собираюсь сделать:
implicit class BoundHtmlInput(input: Input) {
def bindTextTo(v: Var[String]): Input = {
input.oninput = { (e: dom.Event) => v() = input.value}
input
}
def bindNumberTo(v: Var[Int]): Input = {
input.oninput = {(e: dom.Event) => v() = input.valueAsNumber}
input
}
def ~>[T](v: Var[T])(implicit ev: T =:= Int): Input =
bindNumberTo(v.asInstanceOf[Var[Int]])
def ~>[T](v: Var[T])(implicit ev: T =:= String): Input =
bindTextTo(v.asInstanceOf[Var[String]])
}
Он отлично работает для вызовов методов, но не работает для оператора ~>
вызов. Ошибка следующая:
Error:(43, 70) ambiguous reference to overloaded definition,
both method ~> in class BoundHtmlInput of type [T](v: rx.Var[T])(implicit ev: =:=[T,String])org.scalajs.dom.html.Input
and method ~> in class BoundHtmlInput of type [T](v: rx.Var[T])(implicit ev: =:=[T,Int])org.scalajs.dom.html.Input
match argument types (rx.core.Var[String])
И я не доволен использованием asInstanceOf
или.
Я надеюсь, что это обеспечивает достаточно контекста. У меня вопрос, как лучше добиться того, чего я хочу?
1 ответ
Решение
Использование Var[Int]
а также Var[String]
напрямую, с фиктивными последствиями для борьбы с двойным определением после стирания:
def ~>[T](v: Var[Int]): Input =
bindNumberTo(v)
def ~>[T](v: Var[String])(implicit dummy: DummyImplicit): Input =
bindTextTo(v)
Вы можете добавить как можно больше DummyImplicit
При необходимости, если у вас есть еще несколько типов:
def ~>[T](v: Var[Boolean])(implicit dummy1: DummyImplicit,
dummy2: DummyImplicit): Input =
bindBooleanTo(v)