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代码在两个方面有所不同,即StatefulActor
与StatefulActor
的关系以及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 } }
- 使用Gradle构建Kotlin项目有时会导致NoClassDefFoundError失败
- 将kotlin谓词转换为java
- Android N Java 8function(Jack编译器)和Kotlin互操作
- 如何保存参数名称进行调试?
- 为什么Netbeans抱怨模糊,而Intellij却没有
- Android Studio不断生成类似Eclipse的文件
- org.gradle.api.tasks.TaskExecutionException:执行失败的任务’:app:compileDebugKotlin’
- 无法传递结果ResultInfo {who = null,request = 2,result = 0,data = null}相机
- 在IntelliJ的Kotlin> Java转换之后,将源代码恢复为Java