gpt4 book ai didi

java - 如何正确地将对象从scala转换为java?

转载 作者:行者123 更新时间:2023-12-02 11:35:49 31 4
gpt4 key购买 nike

我们使用 Scala 进行开发,并在我们的应用程序中使用 Quartz 作为调度程序。

目前正在开发一个批量安排事务的函数,我遇到了将 scala 映射转换为 java 的问题,因此 Quartz 会接受它。

该函数如下所示:

private def rescheduleJobs(infos: List[TaskDueNotificationInfo]): Unit = {

val jobDatas = infos.foldLeft(List.empty[TaskDueNotificationJobData]) { (datas, info) =>
val taskIdStr = info.task.id.uuid.toString

val triggerKey = new TriggerKey(taskIdStr, Group.TaskDueNotification.toString)
val jobKey = new JobKey(taskIdStr, Group.TaskDueNotification.toString)
val jobDetail =
newJob(classOf[TaskDueNotificationJob]).withIdentity(jobKey).usingJobData("taskId", taskIdStr).build()

val sysTz = DateTimeZone.getDefault
val sysStartTime = info.task.dueDate match {
case Some(dueDate) => new DateTime(dueDate, info.timeZone).toDateTime(sysTz)
case None => throw UnexpectedException("no due date set")
}

val triggerBuilder = newTrigger().withIdentity(triggerKey).forJob(jobKey).startAt(sysStartTime.toDate)
val trigger = triggerBuilder.build()

datas :+ TaskDueNotificationJobData(jobDetail, trigger)
}

val jobsMap = jobDatas.map(data => data.jobDetail -> Set(data.trigger).asJava).toMap.asJava

Try {

jobScheduler.scheduler.scheduleJobs(jobsMap, true)

} match {

case Success(_) => // All good

case Failure(e) => logger.error(e.getMessage)

}
}

当我们使用 Date ScheduleJob(JobDetail jobDetail, Trigger trigger) 进行一项一项调度时,我们最初创建 java 对象,一切正常。在上面的代码中,我收到以下错误:

[error] /Users/ShurikAg/ProcessStreet/dev/process-street/app/scheduling/schedulers/TaskDueNotificationScheduler.scala:99: type mismatch;
[error] found : java.util.Map[org.quartz.JobDetail,java.util.Set[org.quartz.Trigger]]
[error] required: java.util.Map[org.quartz.JobDetail,java.util.Set[_ <: org.quartz.Trigger]]
[error] Note: java.util.Set[org.quartz.Trigger] <: java.util.Set[_ <: org.quartz.Trigger], but Java-defined trait Map is invariant in type V.
[error] You may wish to investigate a wildcard type such as `_ <: java.util.Set[_ <: org.quartz.Trigger]`. (SLS 3.2.10)
[error] jobScheduler.scheduler.scheduleJobs(jobsMap, true)

如果我将它转换为 SimpleTrigger (它就是这样),如下所示:

val jobsMap =
jobDatas.map(data => data.jobDetail -> Set(data.trigger.asInstanceOf[SimpleTrigger]).asJava).toMap.asJava

错误是相同的:

[error] /Users/ShurikAg/ProcessStreet/dev/process-street/app/scheduling/schedulers/TaskDueNotificationScheduler.scala:100: type mismatch;
[error] found : java.util.Map[org.quartz.JobDetail,java.util.Set[org.quartz.SimpleTrigger]]
[error] required: java.util.Map[org.quartz.JobDetail,java.util.Set[_ <: org.quartz.Trigger]]
[error] Note: java.util.Set[org.quartz.SimpleTrigger] <: java.util.Set[_ <: org.quartz.Trigger], but Java-defined trait Map is invariant in type V.
[error] You may wish to investigate a wildcard type such as `_ <: java.util.Set[_ <: org.quartz.Trigger]`. (SLS 3.2.10)
[error] jobScheduler.scheduler.scheduleJobs(jobsMap, true)

但是,SimpleTrigger 是从 Trigger 扩展而来的。

即使我像这样定义 Set 和 Map 的类型:

val jobsMap =
jobDatas
.map(data => data.jobDetail -> Set[SimpleTrigger](data.trigger.asInstanceOf[SimpleTrigger]).asJava)
.toMap[JobDetail, java.util.Set[SimpleTrigger]]
.asJava

这没有帮助。

进行这种转换的正确方法是什么?

最佳答案

比你的答案稍微好一点的替代方案,但除此之外这是最合理的做法:

jobDatas
.map(data => data.jobDetail -> (Set(data.trigger).asJava: java.util.Set[T] forSome { type T <: Trigger }))
.toMap
.asJava

它使用类型归属而不是强制转换,因此在以后更改代码时更安全(如果类型归属不正确,则不会编译,而强制转换可以);而且这种归属的类型更加简单,范围也更加狭窄。

关于java - 如何正确地将对象从scala转换为java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48954441/

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