Почему привязка просмотра и привязка контекста не может обнаружить неявные признаки, присутствующие в контексте
Я новичок в 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
.