2015-04-12 54 views
0

我有這些類定義。函數返回值中的斯卡拉泛型

trait ResultTrait { 
} 
case class PostResult (
    @Key("_id") id: String, 
    success: String, 
    errors: Seq[String] = Seq.empty 
) extends ResultTrait 

case class PostError (
    message: String, 
    errorCode: String 
) extends ResultTrait 

這不會編譯。它給出錯誤「必需的T,但發現PostResult(或PostError)」。

def postLead[T <: SFDCResult](accessToken: AccessToken): 
     Future[T] = { 
    // depends on response from request, return PostResult or PostError 
} 
+4

當你犯了一個方法通用的你說的是調用者決定什麼是T(可能有一些限制),而不是你作爲實現者。 –

回答

1

由於@Travis布朗已經表示,它看起來像你想表達的返回類型的變異(即「這是無論是PostResultPostError」)通過仿製藥的時候,確實你需要是父母的特質。

假設你SDFCResult是,你想用的ResultTrait匿名化的錯誤,我會用以下內容:

// Make the trait sealed so we can only have our two known implementations: 
sealed trait ResultTrait {} 
... 
// Two subclasses as before 

然後你的方法應該僅僅是:

def postLead(accessToken: AccessToken):Future[ResultTrait] = { 
    // depends on response from request, return PostResult or PostError 
}