Scala 如何使用case类处理简单多态性?
我有以下案例课程:Scala 如何使用case类处理简单多态性?,scala,covariance,Scala,Covariance,我有以下案例课程: 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]): Strin
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]
不符合方法fieldsToString的类型参数界限[T如果仔细查看第一条错误消息,您会发现您已经创建了一个函数列表。调用它们:
val fields = List(A(), B(), A())
这是因为case类隐式地具有带有apply
方法的伴生对象。右折叠答案很接近,您拥有的不是真正的函数,而是单例类型:
scala> case class A()
defined class A
scala> A
res0: A.type = A
scala> res0()
res1: A = A()
Odersky在谈到抽象成员时引用:
这里,p.type是一个单例类型,它只表示由p表示的对象。单例类型本身对于支持方法调用的链接也很有用