让一个方法接受两个不同的模型,Scala的最佳实践是什么

让一个方法接受两个不同的模型,Scala的最佳实践是什么,scala,json4s,Scala,Json4s,目前,我有一个方法可以接受ModelA,并知道如何对其执行操作 因此,在我的控制器中,我接受ModelA的请求,并用它调用这个方法 现在,我希望能够接受ModelB的请求,将请求映射为ModelA的请求(因为它具有相同的数据,而不是所有数据,并且名称不同),并使用它调用此方法 假设方法如下所示: def myMethod(data: ModelA): ResModel = { // do something with data } 我目前的控制者是: def doActions():

目前,我有一个方法可以接受
ModelA
,并知道如何对其执行操作

因此,在我的控制器中,我接受
ModelA
的请求,并用它调用这个方法

现在,我希望能够接受ModelB的请求,将请求映射为ModelA的请求(因为它具有相同的数据,而不是所有数据,并且名称不同),并使用它调用此方法

假设方法如下所示:

def myMethod(data: ModelA): ResModel = {
    // do something with data
}
我目前的控制者是:

def doActions(): Action[JValue] = { request => 
    val dataExctracted = request.body.extract[ModelA]
    myMethod(dataExctracted)
    ...
}
我的两个模型都只是单独文件中的案例类:

case class ModelA(a: String, b: String, c: String)

case class ModelB(aAsDifferentName: String, bAsDifferntName: String)
Scala的最佳实践是什么,让myMethod同时接受两种模型(没有
)?控制器对此的反应是什么

还有一种经典的方法可以返回不同的模型,而不必接受不同控制器方法中的调用吗


谢谢

您可以尝试对联合类型进行建模(如Dotty中的
Int | String

大概是这样的:

scala> case class Or[A, B](a: A, b: B)
defined class Or

scala> def test(v: Int Or String): String = {
     | v.toString
     | }
test: (v: Or[Int,String])String

scala> implicit def Int2Or(x: Int): Int Or String = Or(x, "")
Int2Or: (x: Int)Or[Int,String]

scala> implicit def String2Or(x: String): Int Or String = Or(-1, x)
String2Or: (x: String)Or[Int,String]

scala> test(1)
res0: String = Or(1,)

scala> test("")
res1: String = Or(-1,)
最酷的是,您可以像这样使用
字符串或布尔值,但这绝对不是Dotty真正的联合类型


在我看来,strait forward解决方案是使用密封特征并进行模式匹配。

让他们实现虚拟特征并对类型进行模式匹配。您将如何决定从
请求主体中提取什么类型?
?问题是您如何知道
或(-1,”
是什么?当我们想要的是联合类型(密封特征)时,case类是产品类型。直截了当的解决方案是两者都不做,而是使用不同的路线!:p@AndyHayden说得好!当然,正如我所说的,更简单的解决方案是使用trait甚至重载方法。这是对仅仅使用
的改进吗?OP说他们不想使用
或者
,但是你的
或者
只是
或者
在一个不同的名称下,除了(安迪指出的)错误实现之外。