Cloud.orbit.exception.UncheckedException:不知道如何处理状态

什么是这个java类的kotlin等价物?

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

什么是这个java类的kotlin等价物?

您的Kotlin和Java代码在两个方面有所不同,即StatefulActorStatefulActor的关系以及State允许子类化的能力。

对于State ,你想要的是一个嵌套类,而不是Kotlin术语中的一个内部类。 前者对应于Java中的static修饰符,而后者就像没有static修饰符的内部类。

因此,为了与给出的Java代码保持等效,您应该删除inner关键字。

Cloud.orbit.exception.UncheckedException:不知道如何处理状态

至于你的轨道问题,你可以尝试以下。 这也将解释为什么子类化是一个问题:

 // 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() } 

注意Actor的嵌套类叫做ActorState而不是State就像你的问题一样。 当我命名Actor的状态类State我得到了一个类似的错误:

 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而不是它的工作。

这是因为默认情况下Kotlin中的所有类都是封闭的(即Java中的final )。

默认情况下,Kotlin中的所有类都是final的,这对应于Effective Java,Item 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 } }