У меня есть актер 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
?