使用 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)

TwithSchedule 的 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()