2014-09-28 73 views
1

我有以下的情况下类:如何用case类处理简单的多态性?

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

如果仔细观察第一条错误消息,您会看到您已经创建了一个函数列表。打电话给他们:

val fields = List(A(), B(), A()) 

这是由于隐含具有apply方法同伴对象case类。

1

Rightfold回答很接近,你有没有真正的功能,但单类型:

Here, p.type is a singleton type, which represents just the object denoted by p. Singleton types by themselves are also useful for supporting chaining of method calls.

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)