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



我有以下一段代码

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, "john@domain.com")
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>"
}

问题是:为什么编译器在这里被混淆了?

我希望类方法是首选的,并且只有在找不到方法的情况下才服从隐式方法,但这种类型不匹配是完全不同的。

编译器认为john.toHTML(UserSerializer)中的.toHTML是方法HTMLWritable#toHTML,而不是扩展方法HTMLEnrichment#toHTML

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

相关内容

  • 没有找到相关文章

最新更新