2017-07-04 13 views

答えて

3

What is kotlin equivalent of this java class?

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

が、結果をごKotlinとJavaのコードには2つの方法があり、StatefulActorからStateの関係とStateの能力が異なりますサブクラス化を可能にする。

Stateの場合、NestedクラスはKotlinの用語でInnerクラスではありません。前者はJavaのstatic修飾子に対応し、後者はstatic修飾子を持たない内部クラスに似ています。

あなたが指定したJavaコードと同等であるためには、innerキーワードを削除する必要があります。

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

あなたの軌道の問題については、以下を試すことができます。俳優のネストされたクラスは、あなたの質問のようにActorStateなく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() 
} 

お知らせ:サブクラス化が問題である理由も説明します。私は俳優の状態クラス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を使用する場合それが動作します。

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

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

軌道1.2.0にいる間 codeごStateクラスのサブクラスを作成し、それをインスタンス化しようとする(あなたは特別な名前 ActorStateを使用していない場合)。閉じた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 
    } 
} 
+0

同じ例外があります。何も変わっていません – lai0n

+0

この完全な実行可能な例を試してみてください。アクターのStateクラスに 'State'という名前を付ける問題があるようですが、ActorStateは機能します。 –

+0

HelloActorで 'Actor'を拡張する理由 – lai0n

関連する問題