Почему этот код scala имеет несоответствие типа ошибки компиляции - PullRequest
2 голосов
/ 11 июля 2020

Почему этот scala код

case class Foo[T]() {
  def bar(tt: T): Unit = ???
  def bar_(s: String)(implicit ev : T =:= String): Unit = bar(s)
}

вызывает эту ошибку компиляции

[error] type mismatch;
[error]  found   : s.type (with underlying type String)
[error]  required: T
[error]     def foo2(s: String)(implicit ev: T =:= String) = foo(s)

1 Ответ

5 голосов
/ 11 июля 2020

Дело в том, что вам нужны доказательства String =:= T, а не T =:= String.

case class Foo[T]() {
  def bar(tt: T): Unit = ???
  def bar_(s: String)(implicit ev : String =:= T): Unit = bar(s)
}

=:= не симметрично c.

https://typelevel.org/blog/2014/07/02/type_equality_to_leibniz.html

См. Также cats.evidence.Is, scalaz.Leibniz.

В scala 2.13 вы также можете

def bar_(s: String)(implicit ev : T =:= String): Unit = {
  implicit val ev1 = ev.flip
  bar(s)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...