【发布时间】:2016-08-19 15:03:37
【问题描述】:
我正在尝试更多地了解 Scala 中的 TypeClasses,并提出了这个示例
trait Cons[T] {
def cons(t1: T, t2: T):T
}
object Cons {
implicit object StringCons extends Cons[String] {
override def cons(t1: String, t2: String): String = t1 + t2
}
implicit object ListCons extends Cons[List[_]] {
override def cons(t1: List[_], t2: List[_]): List[_] = t1 ++ t2
}
implicit object IntCons extends Cons[Int] {
override def cons(t1: Int, t2: Int): Int = Integer.parseInt(t1.toString + t2.toString)
}
}
def Cons[T](t1: T, t2: T)(implicit c: Cons[T]):T = {
c.cons(t1, t2)
}
Cons("abc", "def") // abcdef
Cons(1, 2) // 12
Cons(List(1,2,3),List(4,5,6)) // does not work, as the expected type is List[Int]
当我创建ListCons 时,我明确设置了List[_] 的类型,如果我理解正确的话,它是存在类型,相当于Java 通配符,这意味着它是某种类型,我们不在乎。
现在的问题是为什么这不起作用。有没有办法让它工作。或者我可能存在一些根本性的误解。
【问题讨论】: