Проблема с привязкой типа с использованием Quartz из 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())
  }

Это дает мне следующую ошибку:

Ошибка: (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 также не компилируется ( такая же ошибка).


person LMeyer    schedule 15.08.2015    source источник
comment
Какой тип T для Trigger и каков тип результата simpleSchedule(). Мне кажется, что какое-то уродство исходит от различий в использовании сайта Java. Для этого в Scala вам обычно нужны экзистенциальные типы, такие как withSchedule[_ <: SimpleTrigger]. Не уверен   -  person 0__    schedule 16.08.2015
comment
@0__ Обновленный вопрос. Экзистенциальный тип дает мне неограниченный подстановочный знак.   -  person LMeyer    schedule 16.08.2015


Ответы (1)


Хорошо, только что заставил это работать, приведя oldTrigger к SimpleTrigger... Это превратило TriggerBuilder<? extends Trigger> getTriggerBuilder() в TriggerBuilder<SimpleTrigger> getTriggerBuilder().

person LMeyer    schedule 27.08.2015