gpt4 book ai didi

Scala - 调用具有泛型类型参数的方法,给定确定正确类型的字符串值

转载 作者:行者123 更新时间:2023-12-02 13:48:29 27 4
gpt4 key购买 nike

我正在设计一个 2 层架构的 API 接口(interface)。它从 URL 中获取字符串参数 fieldName 并返回 JSON 字符串。 fieldName 指的是我的数据库表中的一个字段。您可以将其签名视为:

def controller(fieldName: String): String

在 Controller 中,我想调用数据访问层中的方法来执行以下查询:

SELECT fieldName, SUM(salary) FROM Employee GROUP BY fieldName

由于字段类型不同,查询结果的类型也会不同。此方法由通用类型参数 T 进行参数化,该参数对应于名称为 fieldName 的字段的类型。

def getTotalSalaryByField[T](fieldName: String): Map[T, Long]
  • 如果 fieldName 为“age”,则 T 应为 Int。
  • 如果 fieldName 是“name”,则 T 应该是字符串。等等。

在运行时给定一个特定的 fieldName,我如何调用此方法并为其提供正确的类型?

我不想编写大量 if-else 或模式匹配语句来选择类型。它看起来像这样:

fieldName match {
case "age" => serializeToJson(getTotalSalaryByField[Int]("age"))
case "name" => serializeToJson(getTotalSalaryByField[String]("name"))
...
// 100 more for 100 more fields
}

这太丑了。如果我用 Python 写这个,只需要一行:

json.dumps(getTotalSalaryByField(fieldName))

Scala 是否不适合休息后端编程?因为这似乎是人们会遇到的常见模式,而静态类型会造成阻碍。我希望看到一些关于如何以 scala 方式解决整个问题的建议,即使这意味着重新建模、重写 DAL 和 Controller 。

编辑:@drexin,DAL方法的实际签名是

def myDAOMethod[T](tf: Option[TimeFilter], cf: CrossFilter)
(implicit attr: XFAttribute[T]): Map[T, Long]

T 是 fieldName 的类型。 Long 是 y 的类型。正如您所看到的,我需要根据 url 参数中的 fieldName 选择一个类型为 T。

编辑:添加了一些代码并使用例变得清晰

最佳答案

在编译时和运行时了解变量的类型是有区别的。

如果 fieldName 在编译时未知(即它是一个参数),并且列的类型因 fieldName 而变化,那么您将不会能够在编译时指定方法的返回类型。

您将需要使用返回 AnyRef 的 DAO 方法,而不是为编译时指定类型 T 返回 T 的 DAO 方法>.

旧答案:

数据库访问库可以返回值而无需知道其类型,并且您的代码也需要执行相同的操作。

您正在寻求使用采用类型参数 T 的 DAO 方法:

def myDAOMethod[T](tf: Option[TimeFilter], cf: CrossFilter)
(implicit attr: XFAttribute[T]): Map[T, Long]

...但是正如您所说,您事先不知道类型 T,因此此方法不适用。 (T 用于将数据库列数据转换为 String 或 Int)。

您的 DAO 应该提供此方法的无类型版本,更像是:

def doSelect(tf: Option[TimeFilter], cf: CrossFilter): Map[AnyRef, Long]

您使用什么数据库访问库?

关于Scala - 调用具有泛型类型参数的方法,给定确定正确类型的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25500719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com