如何处理案例类的简单多态?

时间:2014-09-28 12:46:15

标签: 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]): 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]

究竟是什么问题,这是由于案例类,它们的行为与普通类不同吗?

2 个答案:

答案 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方法的伴随对象。