2

私の特徴:

@remote trait Computer {
  def execute(task: Task[Any]): Any
}

を定義するだけでComputerImpl実装されるクラスのコンパニオンオブジェクト内のメインクラスのスニペット。Computerexecute= task.execute()

val name = "Computer"
val engine: Computer = new ComputerImpl()
val stub = UnicastRemoteObject.exportObject(engine, 0).asInstanceOf[Computer]

このエラーが発生します:

system/ComputerImpl.scala:19: error: type mismatch;
 found   : api.Computer
 required: java.rmi.Remote
      val stub = UnicastRemoteObject.exportObject(engine, 0).asInstanceOf[Computer]

もっと明示的にすると消えてしまいますtrait Computer extends Remoteが、「Scala for Impatient」では、「Scalaは、クローン可能オブジェクトとリモートオブジェクトのインターフェースの代わりにアノテーション@cloneableを使用しています」と書かれています。@remoteCloneablejava.rmi.Remote

何が問題になっていますか?

4

1 に答える 1

2

これは動作するはずのように見えますが、これはコンパイルフェーズの問題です。コンパイラーは@remote、コンパイルの型チェックを行った後、を適用します。つまり、インターフェースをトレイト定義に追加します。ただし、次のように機能します。

val stub = UnicastRemoteObject.exportObject(engine.asInstanceOf[java.rmi.Remote], 0).asInstanceOf[Computer]

しかし、それは少し醜いです。

typer編集:コンパイルフェーズで失敗していますが、フェーズの後のフェーズ@remoteで置換が行われているようです。jvmtyper

実際、これは既知の問題であり、型推論は@remoteアノテーションで失敗します。そこから、マーティン・オーダスキーは次のように述べています。

それは完全に仕様どおりです。@remoteは、タイプチェッカーの「extendsRemote」と同じではありません。

これ以上の説明はありませんが、コンパイラソリューションについては息を止めません:-)

于 2012-10-03T08:18:50.567 に答える