Почему привязка просмотра и привязка контекста не может обнаружить неявные признаки, присутствующие в контексте

Я новичок в scala и пытаюсь реализовать метод метода "", который добавляет два числа или строку.

Идеальная практика для этого кода пришла из этого поста, где я имел в виду пример append метод и Appendable черта, используемая для создания implicits.

Я попытался воспроизвести тот же код в моем IntelliJ, используя концепции привязки к виду и контексту, но почему-то это не работает.

Кто-нибудь может предложить, чего не хватает в приведенном ниже коде? почему он не работает? Я также попытался воспроизвести здесь то же самое .

      trait Appendable[A]{
  def append(a: A, b : A) : A
}

object Appendable {
  implicit val appendableString = new Appendable[String] {
    override def append(a: String, b : String): String = a + b
  }

  implicit val appendableInt = new Appendable[Int] {
    override def append(a: Int, b : Int): Int = a + b
  }
}

object ItemAppenderTester extends Object {
  def appendItem[A <% Appendable[A]]( a : A, b : A) = a append b
  def appendItem2[A : Appendable[A]]( a : A, b : A) = implicitly[Appendable[A]].append(a,b)

  def appendItem3(a : A, b : A) (implicit  ev : Appendable[A]) = ev.append(a,b)
  appendItem(1,2)
}

1 ответ

      def appendItem[A <% Appendable[A]]( a : A, b : A)

сейчас просто неправильно. X <% Y означает (implicit ev: X => Y). Вы не определили имплицит A => Appendable[A] (в отличие от статьи на Medium см. toAppendableтам). Также <% устарел.

можно исправить:

      def appendItem2[A : Appendable]( a : A, b : A)

можно исправить:

      def appendItem3[A](a : A, b : A) (implicit  ev : Appendable[A])

Фактически appendItem2 обессахаривается в appendItem3.

Другие вопросы по тегам