隐式类型 class 转换的类型不匹配
Type mismatch on implicit type class conversion
我有如下一段代码
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.WhosebugQuestion.UserSerializer.type
required: Int
println(john.toHTML(UserSerializer))
如果我将 HTMLWritable
的 toHTML
方法重命名为 toHtml
或通常重命名为其他名称并保持 print 语句完整无缺,错误将消失
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>"
}
以及问题:为什么编译器会在这里混淆?
我希望 class 方法是首选,并且仅在未找到该方法时才遵从隐式方法,但这种类型不匹配是完全不同的野兽。
编译器认为 john.toHTML(UserSerializer)
中的 .toHTML
是方法 HTMLWritable#toHTML
而不是扩展方法 HTMLEnrichment#toHTML
.
然后根据 HTMLWritable#toHTML
签名,john.toHTML
是 String
而 john.toHTML(UserSerializer)
是 john.toHTML.apply(UserSerializer)
即 String#apply
期待 Int
.
我有如下一段代码
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.WhosebugQuestion.UserSerializer.type
required: Int
println(john.toHTML(UserSerializer))
如果我将 HTMLWritable
的 toHTML
方法重命名为 toHtml
或通常重命名为其他名称并保持 print 语句完整无缺,错误将消失
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>"
}
以及问题:为什么编译器会在这里混淆?
我希望 class 方法是首选,并且仅在未找到该方法时才遵从隐式方法,但这种类型不匹配是完全不同的野兽。
编译器认为 john.toHTML(UserSerializer)
中的 .toHTML
是方法 HTMLWritable#toHTML
而不是扩展方法 HTMLEnrichment#toHTML
.
然后根据 HTMLWritable#toHTML
签名,john.toHTML
是 String
而 john.toHTML(UserSerializer)
是 john.toHTML.apply(UserSerializer)
即 String#apply
期待 Int
.