我有两个特点
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)
)
这种表述的优点是,如果request
is null
,它将起作用,并将这种情况视为passRequestInResponse
was。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] 删除。
我来说两句