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表示的对象。单例类型本身对于支持方法调用的链接也很有用