Соответствует переходу состояния Akka между java-перечислениями - PullRequest
0 голосов
/ 18 сентября 2019

У меня есть актер Akka FSM, состояние которого определяется как перечисление Java:

TheState.java

public enum TheState {
  Uninitialized, Ready 
}

В результате повторного использования кодачерез несколько проектов мой актер Scala наследует от akka.actor.AbstractFSM, который является Java API, который добавляет еще два определения onTransition.Это приводит к ошибке компиляции, когда я пытаюсь написать onTransition стандартным способом:

MyActor.scala

onTransition {
  TheState.Uninitialized -> TheState.Ready => { doStuff() }
}
[error] The argument types of an anonymous function must be fully known. (SLS 8.5)
[error] Expected type was: ?
[error]     onTransition {
[error]                  ^

Если явызвать ошибку компиляции с помощью onTransition(3), сообщение об ошибке:

overloaded method value onTransition with alternatives:
[error]   (transitionHandler: akka.japi.pf.FI.UnitApply2[TheState,TheState])Unit <and>
[error]   (transitionHandlerBuilder: akka.japi.pf.FSMTransitionHandlerBuilder[TheState])Unit <and>
[error]   (transitionHandler: MyActor.this.TransitionHandler)Unit
[error]  cannot be applied to (Int)
[error]     onTransition(3)
[error]     ^

предполагает, что тип должен быть TransitionHandler.

val onTransitionHander: TransitionHandler = {
  TheState.Uninitialized -> TheState.Ready => { doStuff() }
}
onTransition(onTransitionHandler)

компилируется.Это кажется работоспособным и не намного более многословным, чем стандартная формулировка.

TransitionHandler определен в FSM как тип PartialFunction[(S, S), Unit], поэтому проблема заключается в попытке передать частичную функцию перегруженному методу, что (где-то) приводит к сбою вывода типа.

Есть ли альтернатива указанию типов в частичной функции, кроме объявления ее в val и явного указания типа val?

...