函数 return 值中的 Scala 泛型
Scala generics in function return value
我定义了这些类。
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
这不会编译。它给出错误 "Required T, but found PostResult (or PostError)"。
def postLead[T <: SFDCResult](accessToken: AccessToken):
Future[T] = {
// depends on response from request, return PostResult or PostError
}
正如@Travis Brown 已经指出的那样,看起来您正试图通过泛型来表达 return 类型(即 "it's either a PostResult
or a PostError
")的可变性,而您真正需要的只是parent 特质。
假设您的 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
}
我定义了这些类。
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
这不会编译。它给出错误 "Required T, but found PostResult (or PostError)"。
def postLead[T <: SFDCResult](accessToken: AccessToken):
Future[T] = {
// depends on response from request, return PostResult or PostError
}
正如@Travis Brown 已经指出的那样,看起来您正试图通过泛型来表达 return 类型(即 "it's either a PostResult
or a PostError
")的可变性,而您真正需要的只是parent 特质。
假设您的 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
}