Cloud.orbit.exception.UncheckedException: не знаю, как обрабатывать состояние

Что такое эквивалент kotlin этого класса java?

public class StatefulActor extends AbstractActor<StatefulActor.State> implements Some { public static class State { String lastMessage; } } 

Я пытался:

 class HelloActor: AbstractActor<HelloActor.State>(), Hello { inner class State { var lastMessage: String? = null } 

но приводит к Cloud.orbit.exception.UncheckedException: Don't know how to handle state

Что такое эквивалент kotlin этого класса java?

Ваш код Kotlin и Java отличается двумя способами: отношением состояния к StatefulActor и способностью State разрешать подклассы.

Для State то, что вы хотите, является вложенным классом, а не классом Inner в терминах Kotlin. Первый соответствует static модификатору в Java, тогда как последний похож на внутренний класс без static модификатора.

Итак, для эквивалентности с кодом Java, который вы дали, вы должны отказаться от inner ключевого слова.

Cloud.orbit.exception.UncheckedException: не знаю, как обрабатывать состояние

Что касается вашей проблемы с Orbit, вы можете попробовать следующее. Это также объясняет, почему подклассификация является проблемой:

 // compile and run with cloud.orbit:orbit-runtime:1.2.0 import cloud.orbit.actors.runtime.AbstractActor import cloud.orbit.actors.Actor import cloud.orbit.actors.Stage import cloud.orbit.concurrent.Task class HelloActor: AbstractActor<HelloActor.ActorState>(), Hello { override fun sayHello(greeting: String): Task<String> { val lastMessage = state().lastMessage state().lastMessage = greeting return Task.fromValue(lastMessage) } class ActorState { var lastMessage: String? = null } } interface Hello : Actor { fun sayHello(greeting: String): Task<String> } fun main(args : Array<String>) { val stage = Stage.Builder().clusterName("orbit-helloworld-cluster").build() stage.start().join() stage.bind() val helloActor = Actor.getReference(Hello::class.java, "0"); var response = helloActor .sayHello("Welcome to orbit 1").join() println(response) // should print null response = helloActor .sayHello("Welcome to orbit 2").join() println(response) // should print "Welcome to orbit 1" stage.stop().join() } 

Обратите внимание, что вложенный класс ActorState называется ActorState а не State как в вашем вопросе. Когда я назвал State Act, у меня получилась аналогичная ошибка:

 cloud.orbit.exception.UncheckedException: Don't know how to handle state: HelloActor$State... Caused by: cloud.orbit.exception.UncheckedException: cloud.orbit.exception.UncheckedException: Don't know how to handle state: HelloActor$State Caused by: cloud.orbit.exception.UncheckedException: Don't know how to handle state: HelloActor$State Caused by: cloud.orbit.exception.UncheckedException: java.lang.ClassNotFoundException: HelloActor$ActorState 

Но когда я использовал имя вложенного класса HelloActor.ActorState он работает.

Это связано с тем, что по умолчанию все классы в Котлине закрыты (т.е. final в терминах Java).

По умолчанию все классы в Котлине являются окончательными, что соответствует Эффективной Java, Пункт 17: Дизайн и документ для наследования, или же запретить его.

На орбите 1.2.0 код (если вы не используете специальное имя ActorState ) пытается подклассифицировать ваш класс State и затем создать его экземпляр. Это не сработает, если вы продолжите закрытую расширяемость по умолчанию Kotlin.

Если вы хотите использовать свое имя для класса состояния Actor, вы должны объявить его open . например

 class HelloActor: AbstractActor<HelloActor.State>(), Hello { override fun sayHello(greeting: String): Task<String> { val lastMessage = state().lastMessage state().lastMessage = greeting return Task.fromValue(lastMessage) } open class State { var lastMessage: String? = null } }