Scala类型不匹配中的@remote注释

时间:2012-10-03 07:11:33

标签: java scala rmi

我的特质:

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

ComputerImpl的伴随对象中的主要类的片段,只需将Computer定义为execute即可实现= 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@remote而不是Cloneable,那就消失了可复制和远程对象的java.rmi.Remote接口。“

出了什么问题?

1 个答案:

答案 0 :(得分:2)

这看起来好像应该有效,但这是编译阶段的问题。在完成编译的类型检查之后,编译器正在应用@remote,即在特性定义的接口中添加。但是,以下工作:

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

但它有点难看。

编辑:它在typer编译阶段失败了,而@remote阶段的jvm替换正好在typer阶段之后完成

事实上,这是一个已知问题,type inference fails with @remote annotation。从那里,马丁奥德斯基说:

  

完全如此。 @remote与`extends不同   远程'用于类型检查器。

没有进一步的解释,但我不会为编译器解决方案屏住呼吸: - )