我的特质:
@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
接口。“
出了什么问题?
答案 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不同 远程'用于类型检查器。
没有进一步的解释,但我不会为编译器解决方案屏住呼吸: - )