Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以为现有的JavaBean类获取Scala案例类?_Java_Scala_Playframework - Fatal编程技术网

是否可以为现有的JavaBean类获取Scala案例类?

是否可以为现有的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

题目里有这个问题的短篇故事。有一些Java类,例如,我想(不重写它)将其作为一个case类,也就是说,它有
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)方法创建隐式类,模拟案例类: