2

我的特质:

@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不是可克隆和远程对象的Cloneableandjava.rmi.Remote接口。”

出了什么问题?

4

1 回答 1

2

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

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

但这有点难看。

编辑:它在typer编译阶段失败,而看起来@remote替换是在jvm阶段完成的,也就是typer阶段之后。

事实上,这是一个已知问题,类型推断因 @remote 注释而失败。从那里,马丁奥德斯基说:

这完全符合规定。@remote 与类型检查器的“扩展远程”不同。

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

于 2012-10-03T08:18:50.567 回答