scala - 与 Scala 隐式类型不匹配

标签 scala implicit

我正在尝试在 Scala 中使用隐式。

object TypeClasses extends App {
  trait HTMLWritable {
    def toHTML: String
  }

  case class User(name: String, age: Int, email: String) extends HTMLWritable {
    override def toHTML: String = s"<div>$name ($age yo) <a href=$email/> </div>"
  }

  val john = User("John", 32, "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7b111413153b091418100f131e110d1655181416" rel="noreferrer noopener nofollow">[email protected]</a>")
  trait HTMLSerializer[T] {
    def serialize(value: T): String
  }

  object UserSerializer extends HTMLSerializer[User] {
    def serialize(user: User): String = s"<div>${user.name} (${user.age} yo) <a href=${user.email}/> </div>"
  }

  implicit class HTMLEnrichment[T](value: T) {
    def toHTML(serializer: HTMLSerializer[T]): String = serializer.serialize(value)
  }

  println(john.toHTML(UserSerializer))
}

此代码无法编译:

Error:(41, 23) type mismatch;
 found   : lectures.part4implicits.TypeClasses.UserSerializer.type
 required: Int
  println(john.toHTML(UserSerializer))

我无法理解该消息,因为根据 IntelliJ,john.toHTML 是对 HTMLEnrichment 上的 toHTML 方法的调用> 类,它需要一个 HTMLSerializer,这就是我给它的。我没有在任何地方定义需要 InttoHTML 方法。

最佳答案

这是因为您不小心重载了 toHTML 方法。您收到的错误是因为 String.apply 返回给定索引处的字符,这就是您收到有关 Int 的错误的原因。

Intelij 并不总是能够有效地识别出这种阴影。让隐式机制远离域模型是一个好主意,例如将专门的序列化解耦为隐式,就像您所做的那样:

  implicit object UserSerializer extends HTMLSerializer[User] {
    def serialize(user: User): String = s"<div>${user.name} (${user.age} yo) <a href=${user.email}/> </div>"
  }

然后从您的用户中删除所有内容,也许还可以添加一个助手。

trait HTMLSerializer {
  def toHTML: String
}

object HTMLSerializer {
  // if you put this here you don't need to explicitly import it.
  implicit class HTMLEnrichment[T](val value: T) extends AnyVal {
    def toHTML(implicit serializer: HTMLSerializer[T]): String = 
      serializer.serialize(value)
  }
}

这意味着您可以简单地获得与使用配套方法相同的效果,但您可以使所有内容保持良好的解耦,并且您不会冒出现此类着色效果的风险。

关于scala - 与 Scala 隐式类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55784161/

相关文章:

wolfram-mathematica - 隐式函数的 FindFit - mathematica

scala - 使用 scala sortWith 函数对对象中的多个字段进行排序

scala - 如何使用基于案例类的数据集解析 CSV?

scala - 处理内部隐式参数列表所需的显式参数

scala - 如何通过隐式分解类型构造函数?

scala - 为什么有从 Float/Double 到 BigDecimal 的隐式转换,而不是从 String 的隐式转换?

scala - 如何使用 sbt-assemble 制作多项目 fat jar

json - Scala Play Json - 如何从数组中的元素读取单个元素?

scala - Spark数据帧:How to add a index Column : Aka Distributed Data Index

scala - `implicit' 修饰符不能用于顶级对象