Я пытаюсь перенести задание и определил свой метод следующим образом:
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())
}
Это дает мне следующую ошибку:
Ошибка: (33, 55) аргументы типа [org.quartz.SimpleTrigger] не соответствуют методу с границами параметра типа расписания [SBT ‹: ?0] val up = oldTrigger.getTriggerBuilder.withScheduleSimpleTrigger.build()
Теперь посмотрим на подпись withSchedule
:
public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder)
T
— это параметр типа класса withSchedule
, который выглядит как class TriggerBuilder<T extends Trigger>
. Таким образом, T
должен определяться параметром типа экземпляра, возвращаемым getTriggerBuilder
, который здесь должен быть TriggerBuilder<SimpleTrigger> getTriggerBuilder()
, поэтому T
является SimpleTrigger
. В интерфейсе Trigger
getTriggerBuilder
определяется следующим образом: TriggerBuilder<? extends Trigger> getTriggerBuilder()
.simpleSchedule
возвращает SimpleScheduleBuilder
(который расширяет ScheduleBuilder<SimpleTrigger>
).
Я понимаю, что SBT
(то есть SimpleTrigger
тоже, если мы посмотрим на ошибку) должен расширять класс, который расширяет Trigger
. Проблема в том, что у нас есть SimpleTrigger <: SimpleTrigger
. Хотя совершенно не уверен, что правильно прочитал.
Если я не наберу withSchedule
, я получу ту же ошибку, плюс еще одну:
Ошибка:(37, 46) несоответствие типов; найдено: org.quartz.SimpleScheduleBuilder требуется: org.quartz.ScheduleBuilder[SBT] .withIntervalInMinutes(randomInterval).repeatForever)
^
Может ли кто-нибудь помочь мне здесь? К сведению, официальный пример Quartz также не компилируется ( такая же ошибка).
T
дляTrigger
и каков тип результатаsimpleSchedule()
. Мне кажется, что какое-то уродство исходит от различий в использовании сайта Java. Для этого в Scala вам обычно нужны экзистенциальные типы, такие какwithSchedule[_ <: SimpleTrigger]
. Не уверен - person 0__   schedule 16.08.2015