如何使用泛型从Scala方法返回

用户名

我有两个特点

trait TResponseData extends Serializable {} //all response data
trait TRequestData extends Serializable {} //all request

现在我有Response类,其中包含数据和请求

case class Response[A <: TResponseData, B <: TRequestData](data: A, request: B = null){}

尽管案例类Response的实例必须具有数据,但请求不是强制性的。因此,在case类构造函数中,我将其默认声明为null。从Scala控制台,我可以创建其实例,例如

Response(null, null)
Response(null)

为了生成Response的实例,我创建了辅助方法:

def generateResponse[A <: TResponseData, B <: TRequestData] (data: A, request: B, passRequestInResponse: Boolean): Response[A, B] = {
    if (passRequestInResponse) 
        return Response(data, request)
    return Response(data, null)
}

基于boolean passRequestInResponse,我在响应中设置请求。在进行相同的编译时,出现以下错误:

error: type mismatch;
 found   : Null(null)
 required: B
           return Response(data, null)

我该如何实现(在generateResponse方法中使请求成为可选

提姆

使用null是一个坏主意(按原样return),因此最好使用Option

trait TResponseData extends Serializable //all response data
trait TRequestData extends Serializable //all request

case class Response[A <: TResponseData, B <: TRequestData](data: A, request: Option[B]=None)

def generateResponse[A <: TResponseData, B <: TRequestData] (data: A, request: B, passRequestInResponse: Boolean): Response[A, B] =
  if (passRequestInResponse) {
    Response(data, Some(request))
  } else {
    Response(data)
  }

您还可以Option像这样做一些魔术:

def generateResponse[A <: TResponseData, B <: TRequestData] (data: A, request: B, passRequestInResponse: Boolean): Response[A, B] =
  Response(
    data,
    Some(request).filter(_ => passRequestInResponse)
  )

这种表述的优点是,如果requestis null它将起作用,并将这种情况视为passRequestInResponsewas。false

更新资料

正如@jwvh所指出的,尚不清楚该generateResponse函数是否有用,因为您可以根据需要进行调用Response(data, Some(request))调用Response(data)如果您不喜欢Some第一个版本,请使用自定义apply方法创建一个类对象

object Response {
  def apply[A <: TResponseData, B <: TRequestData](data: A, request: B): Response[A, B]
    = Response(data, Option(request))
}

然后,您可以使用Response(data, request)如果request为,这将正常工作null

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章