使用 Scala 中的 Quartz 类型绑定问题
Type bound issue using Quartz from Scala
我正在尝试重新安排工作,我已经这样定义了我的方法:
private def updateTriggerInterval(context: JobExecutionContext): Unit = {
val randomInterval = rand.nextInt((max - min) + 1) + min
val oldTrigger: Trigger = context.getTrigger
val up: TriggerBuilder[SimpleTrigger] = oldTrigger.getTriggerBuilder.withSchedule[SimpleTrigger](simpleSchedule()
.withIntervalInMinutes(randomInterval).repeatForever())
val scheduler = StdSchedulerFactory.getDefaultScheduler
scheduler.rescheduleJob(oldTrigger.getKey, up.build())
}
这给了我以下错误:
Error:(33, 55) type arguments [org.quartz.SimpleTrigger] do not
conform to method withSchedule's type parameter bounds [SBT <: ?0]
val up = oldTrigger.getTriggerBuilder.withScheduleSimpleTrigger.build()
现在查看 withSchedule
的签名:
public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder)
T
是 withSchedule
的 class 上的类型参数,看起来像 class TriggerBuilder<T extends Trigger>
。所以T
应该是由getTriggerBuilder
返回的实例的类型参数定义的,这里应该是TriggerBuilder<SimpleTrigger> getTriggerBuilder()
,所以T
是一个SimpleTrigger
。在 Trigger
接口中,getTriggerBuilder
定义如下:TriggerBuilder<? extends Trigger> getTriggerBuilder()
.simpleSchedule
returns a SimpleScheduleBuilder
(扩展 ScheduleBuilder<SimpleTrigger>
)。
我在这里的理解是 SBT
(即 SimpleTrigger
如果我们查看错误)应该扩展 class 扩展 Trigger
。这里的问题是我们有 SimpleTrigger <: SimpleTrigger
。完全不确定我是否读对了。
如果我不输入 withSchedule
,我会得到同样的错误,再加上这个:
Error:(37, 46) type mismatch; found :
org.quartz.SimpleScheduleBuilder required:
org.quartz.ScheduleBuilder[SBT]
.withIntervalInMinutes(randomInterval).repeatForever)
^
有人可以帮我吗?作为记录,official Quartz example 也没有编译(同样的错误)。
好吧,只是通过将 oldTrigger 转换为 SimpleTrigger 使其工作...将 TriggerBuilder<? extends Trigger> getTriggerBuilder()
变成了 TriggerBuilder<SimpleTrigger> getTriggerBuilder()
。
我正在尝试重新安排工作,我已经这样定义了我的方法:
private def updateTriggerInterval(context: JobExecutionContext): Unit = {
val randomInterval = rand.nextInt((max - min) + 1) + min
val oldTrigger: Trigger = context.getTrigger
val up: TriggerBuilder[SimpleTrigger] = oldTrigger.getTriggerBuilder.withSchedule[SimpleTrigger](simpleSchedule()
.withIntervalInMinutes(randomInterval).repeatForever())
val scheduler = StdSchedulerFactory.getDefaultScheduler
scheduler.rescheduleJob(oldTrigger.getKey, up.build())
}
这给了我以下错误:
Error:(33, 55) type arguments [org.quartz.SimpleTrigger] do not conform to method withSchedule's type parameter bounds [SBT <: ?0] val up = oldTrigger.getTriggerBuilder.withScheduleSimpleTrigger.build()
现在查看 withSchedule
的签名:
public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder)
T
是 withSchedule
的 class 上的类型参数,看起来像 class TriggerBuilder<T extends Trigger>
。所以T
应该是由getTriggerBuilder
返回的实例的类型参数定义的,这里应该是TriggerBuilder<SimpleTrigger> getTriggerBuilder()
,所以T
是一个SimpleTrigger
。在 Trigger
接口中,getTriggerBuilder
定义如下:TriggerBuilder<? extends Trigger> getTriggerBuilder()
.simpleSchedule
returns a SimpleScheduleBuilder
(扩展 ScheduleBuilder<SimpleTrigger>
)。
我在这里的理解是 SBT
(即 SimpleTrigger
如果我们查看错误)应该扩展 class 扩展 Trigger
。这里的问题是我们有 SimpleTrigger <: SimpleTrigger
。完全不确定我是否读对了。
如果我不输入 withSchedule
,我会得到同样的错误,再加上这个:
Error:(37, 46) type mismatch; found : org.quartz.SimpleScheduleBuilder required: org.quartz.ScheduleBuilder[SBT] .withIntervalInMinutes(randomInterval).repeatForever)
^
有人可以帮我吗?作为记录,official Quartz example 也没有编译(同样的错误)。
好吧,只是通过将 oldTrigger 转换为 SimpleTrigger 使其工作...将 TriggerBuilder<? extends Trigger> getTriggerBuilder()
变成了 TriggerBuilder<SimpleTrigger> getTriggerBuilder()
。