隐式类型类转换时类型不匹配

问题描述 投票:0回答:1

我有以下代码

  trait HTMLWritable {
    def toHTML: String
  }

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

  trait HTMLSerializer[T] {
    def serialize(value: T): String
  }

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

  }

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

  val john = User("John", 32, "[email protected]")

  println(john.toHTML(UserSerializer))

会产生以下错误

Error:(30, 23) type mismatch;
 found   : advanced.StackOverflowQuestion.UserSerializer.type
 required: Int
  println(john.toHTML(UserSerializer))

如果我将HTMLWritabletoHTML方法重命名为toHtml或通常将其重命名为其他内容并保持打印语句不变,则错误将消失

 trait HTMLWritable {
    def tohtml: String
  }

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

和问题:为什么编译器在这里混淆?

我希望类方法将是首选方法,并且仅当未找到该方法但该类型不匹配是完全不同的野兽时才采用隐式方法。

scala implicit
1个回答
1
投票
编译器认为.toHTML中的john.toHTML(UserSerializer)是方法HTMLWritable#toHTML,而不是扩展方法HTMLEnrichment#toHTML

然后根据HTMLWritable#toHTML签名,john.toHTMLStringjohn.toHTML(UserSerializer)john.toHTML.apply(UserSerializer),即String#apply期望Int

© www.soinside.com 2019 - 2024. All rights reserved.