我有以下案例类:
object Fields {
abstract class Base{
def getString: String
}
case class A() extends Base{
def getString = "A+++"
}
case class B() extends Base{
def getString = "B++"
}
def fieldsToString(fields: List[Base]): String = {
fields.tail.foldLeft(s"${fields.head.getString}") {(acc, f) =>
acc + s",${f.getString}"
}
}
}
然后我尝试以下列方式调用此函数:
val fields = List(A, B, A)
val result = Fields.fieldsToString(fields)
这给了我以下错误:
type mismatch;
[error] found : List[scala.runtime.AbstractFunction0[Product with Serializable
with Fields.Base] with Serializable]
所以我认为我需要引入协方差:
def fieldsToString[T >: Base](fields: List[T]): String = {
fields.tail.foldLeft(s"${fields.head.getString}") {(acc, f) =>
acc + s",${f.getString}"
}
}
然后给出了以下编译错误:
do not conform to method fieldsToString's type parameter bounds [T <: Fields.Base]
究竟是什么问题,这是由于案例类,它们的行为与普通类不同吗?
答案 0 :(得分:1)
右边的答案很接近,你所拥有的不是真正的功能,而是单身人士的类型:
scala> case class A()
defined class A
scala> A
res0: A.type = A
scala> res0()
res1: A = A()
Odersky在谈论抽象成员时引用the scala overview paper (on page 9, right column):
这里,p.type是单例类型,它只表示由p表示的对象。单例类型本身对于支持方法调用的链接也很有用。
答案 1 :(得分:0)
如果仔细查看第一条错误消息,您会看到已创建了一个函数列表。打电话给他们:
val fields = List(A(), B(), A())
这是由于案例类隐式使用apply
方法的伴随对象。