2017-07-04 34 views
1

什么是这个java类的kotlin等价物?Cloud.orbit.exception.UncheckedException:不知道如何处理状态

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

回答

3

What is kotlin equivalent of this java class?

你科特林和Java代码有两点不同,该StateStatefulActor关系和State能力允许子类化。

对于State你想要的是Nested类而不是Kotlin术语中的Inner类。前者对应于Java中的static修饰符,而后者则类似于不带static修饰符的内部类。

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

Cloud.orbit.exception.UncheckedException: Don't know how to handle state

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

// 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而不是State在你的问题。当我命名为演员的状态类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它的工作原理。

This is because by default all classes in Kotlin are closed (i.e. final in Java terms).

By default, all classes in Kotlin are final, which corresponds to Effective Java, Item 17: Design and document for inheritance or else prohibit it.

虽然在轨道1.2.0的code(如果你不使用特殊名称ActorState)试图继承你的状态类,然后进行实例化。如果您使用关闭的Kotlin默认扩展功能,这将不起作用。

如果您希望将自己的名字用于演员的州级课程,则必须将其声明为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 
    } 
} 
+0

同样的例外。没有什么变化 – lai0n

+0

试试这个完整的可运行示例,它适用于我。似乎有一些问题将Actor的状态类命名为“State”,但“ActorState”起作用。 –

+0

为什么在HelloActor中扩展Actor? – lai0n