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 } }
- 将数据显示从Java转换为Kotlin
- 在运行时添加片段与Kotlin原因“不幸的应用程序已停止”
- “这个项目附带的一些Kotlin库有不支持的格式。请更新库或插件”
- Kotlin kotlinClass.class.getName()不能返回包名,而只能返回简单的类名
- 休眠与Kotlin:@ManyToOne(fetch = FetchType.LAZY)
- 如何在Kotlin中创建一个库,并从目标为JavaScript或Java的项目中使用它?
- 如何使用Maven编译Java + Kotlin项目?
- Spring Security,Method Security注解(@Secured)不工作(java config)
- 为什么kotlin lambda反编译为java代码是(Function0)null.INSTANCE