我已经创建了一个玩具示例来说明我不理解的编译器错误。不应该C[_] <: Traversable[T]
Safe[T]
到Safe[C[T]]
的隐式转化适用吗?
import scala.language.{implicitConversions, higherKinds}
class ToyExample {
implicit val stringsafe = new Safe[String] {
override def stringify(value: String): String = value
}
def main(args: Array[String]): Unit = {
val a: String = "c"
val b: Seq[String] = Seq("1", "2", "3")
safe(a)
safe(b) // why is this a compiler error?
}
def safe[T](value: T)(implicit safe: Safe[T]): String = safe stringify value
}
object Safe {
implicit def safeTraversable[C[_] <: Traversable[T], T](implicit safe: Safe[T]): Safe[C[T]] =
new Safe[C[T]] {
override def stringify(value: C[T]): String = value.map(safe.stringify).toString()
}
}
trait Safe[T] {
def stringify(value: T): String
}
答案 0 :(得分:2)
好的,所以我想出了如何编译代码,但我不明白原因。
通过修改隐式转换以删除更高级别的占位符,我能够将其编译为:
implicit def safeTraversable[C <: Traversable[T], T](implicit safe: Safe[T]): Safe[C] =
new Safe[C] {
override def stringify(value: C): String = value.map(safe.stringify).toString()
}
有谁理解为什么较高的kinded类型无效?