是否可以为现有的JavaBean类获取Scala案例类?
题目里有这个问题的短篇故事。有一些Java类,例如,我想(不重写它)将其作为一个case类,也就是说,它有是否可以为现有的JavaBean类获取Scala案例类?,java,scala,playframework,Java,Scala,Playframework,题目里有这个问题的短篇故事。有一些Java类,例如,我想(不重写它)将其作为一个case类,也就是说,它有apply和unapply方法 长话短说:我有一个Scala Play应用程序,在那里我定义了一个表单,它有两个间隔,即 import org.joda.time.Interval case class MyParams(param1: String, interval1: Interval, interval2: Interval) 然后我尝试定义嵌套映射,但是Interval是一个J
apply
和unapply
方法
长话短说:我有一个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)
}
因此OP的代码编译为只缺少导入IntervalUtils.\uu
,然后作为附加奖励也可以执行以下操作:
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
implicit val jodaIntervalWrites=新写入[org.joda.time.Interval]{
def写入(interval:org.joda.time.interval)=Json.obj(
“开始”->interval.getStart,
“结束”->interval.getEnd
)
}
隐式val-jodaIntervalReads:Reads[org.joda.time.Interval]=(
(JsPath\“start”)。读取[DateTime]和
(JsPath\“end”).read[DateTime]
)(Interval.apply)/要做到这一点,您不需要case类,只需要两个具有合适签名的方法,并且可以轻松定义它们:
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
,只需编写新的Interval(,)
(不确定重载是否会导致此特定用例出现问题,但如果是这样,只需指定占位符类型即可)。要做到这一点,您不需要case类,只需要两个具有适当签名的方法,您可以轻松定义它们:
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
,只需编写新的Interval(,)
(不确定重载是否会导致此特定用例出现问题,但如果是这样,只需指定占位符类型即可)。一种解决方案可以是使用apply和unapply(以及其他您可能希望的副本)创建隐式类方法,模拟案例类:一种解决方案可以是使用apply和unapply(以及您可能希望的其他方法,如copy)方法创建隐式类,模拟案例类: