Неоднозначная перегрузка: исправить или попробовать что-то еще?

Справочная информация: я работаю над использованием scala.js/ scalatags вместе с scala.rx. То, что я пытаюсь достичь, это привязка значений из входных данных HTML для Rx Vars, используя стиль оператора. Вот что я собираюсь сделать:

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)
Другие вопросы по тегам