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
}
}
同じ例外があります。何も変わっていません – lai0n
この完全な実行可能な例を試してみてください。アクターのStateクラスに 'State'という名前を付ける問題があるようですが、ActorStateは機能します。 –
HelloActorで 'Actor'を拡張する理由 – lai0n