2015-04-12 5 views
0

У меня эти классы определены.Scala generics в функции возвращаемое значение

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

Когда вы делаете метод generic, вы говорите, что вызывающий абонент принимает решение о том, что такое 'T' (возможно, с некоторыми ограничениями), а не как разработчик. –

ответ

1

Как @Travis Браун уже заявил, похоже, что вы пытаетесь выразить изменчивость типа возвращаемого значения (т.е. «это либо PostResult или PostError») через дженериков, когда на самом деле все, что вам нужно является родительским признаком.

Если предположить, что 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 
} 
Смежные вопросы