gpt4 book ai didi

java - 是否可以为现有的 Java bean 类获取 Scala 案例类?

转载 作者:行者123 更新时间:2023-12-01 20:51:56 25 4
gpt4 key购买 nike

问题的简短故事在标题中。有一些 Java 类,例如org.joda.time.Interval我想(不重写它)使其成为一个案例类,即具有 applyunapply 方法。

长话短说:我有一个 Scala-Play 应用程序,我定义了一个需要两个间隔的表单,即

import org.joda.time.Interval

case class MyParams(param1: String, interval1: Interval, interval2: Interval)

然后我尝试定义嵌套映射,但 Interval 是一个 Java 类,并且没有 apply/unapply 并且我'我宁愿不创建自己的副本。

val myForm = Form {
mapping(
"param1" -> nonEmptyText,
"interval1" -> mapping(
"start" -> jodaDate,
"end" -> jodaDate,
)(Interval.apply)(Interval.unapply), // <<<<<<<<<< Cannot resolve symbol ...
"interval2" -> mapping(
"start" -> jodaDate,
"end" -> jodaDate,
)(Interval.apply)(Interval.unapply) // <<<<<<<<<< Cannot resolve symbol ...
)(MyParams.apply)(MyParams.unapply)
}

当然,我可以展平结构,但这样做在设计方面不能很好地扩展,而且现有的 JSON 复合结构需要组合,我想重用该表单来绑定(bind)到 JSON 请求和表单提交。

更新建立在已接受的答案之上,并考虑到我最后所做的语法糖:

object IntervalUtils {
implicit object Interval {
def apply(start: DateTime, end: DateTime) = new org.joda.time.Interval(start, end)
def unapply(interval: org.joda.time.Interval) = Some((interval.getStart, interval.getEnd))
}
}

所以OP的代码编译时只缺少import IntervalUtils._,然后作为额外的奖励也可以这样做:

implicit val jodaIntervalWrites = new Writes[org.joda.time.Interval] {
def writes(interval: org.joda.time.Interval) = Json.obj(
"start" -> interval.getStart,
"end" -> interval.getEnd
)
}

implicit val jodaIntervalReads: Reads[org.joda.time.Interval] = (
(JsPath \ "start").read[DateTime] and
(JsPath \ "end").read[DateTime]
)(Interval.apply _) // <<<<<<<<<<<<<<<<<< reused here

最佳答案

为此,您不需要案例类,只需要两个具有合适签名的方法,并且可以轻松定义它们:

object JodaTime {
def mkInterval(start: ReadableInstant, end: ReadableInstant) = new Interval(start, end)
def unmkInterval(interval: Interval) = Some((interval.getStart, interval.getEnd))
}

// elsewhere
mapping(
"start" -> jodaDate,
"end" -> jodaDate,
)(JodaTime.mkInterval)(JodaTime.unmkInterval)

事实上,你甚至不需要mkInterval,你可以只写new Interval(_, _)(不确定重载是否会导致这个问题)特定的用例,但如果是这样,只需指定占位符类型)。

关于java - 是否可以为现有的 Java bean 类获取 Scala 案例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225142/

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