2

我正在阅读一本关于 Scala Actors 的书,但我遇到了一些语法问题。在实践中,我倾向于这样分配我的变量和函数定义:

val v: String = "blahblahblah"
def f(n: Int): Int = n+1

包括项目名称后的(返回)类型。虽然我知道这不是必需的,但我已经习惯了这种约定,并发现它使我自己更容易理解代码。话虽如此,请注意以下示例:

class Server extends Actor {
  def act() = {
    while (true) {
      receive {
        case Message(string) => reply("Good,very good.")
      }
    }
  }
}
def sendMsg(m: Message, s: Server): Future[String] = {
  s !! m
}

上面的代码在编译时产生一个错误,抱怨服务器返回了 Future[Any],而不是 Future[String]。我知道可以通过从 sendMsg 中删除返回类型来规避这个问题:

def sendMsg(m: Message,s: Server) = s !! m

但是,这不符合我的风格。有没有一种方法可以指定服务器生成的 Future 类型(而不是 Future[Any])?

4

1 回答 1

4

您的问题比样式更深:您得到 a 是Future[Any]因为编译器无法静态地更好地了解当前的 Akka actor 以及现在已弃用的 scala.actors。在没有编译时检查的情况下,您需要求助于运行时检查,正如 idonnie 已经评论的那样:

(actorRef ? m).mapTo[String]

这会将另一个 Future 链接到原始的 Future,该 Future 填充一个String结果,ClassCastException如果演员顽皮,或者TimeoutException如果演员没有回复,请参阅Akka 文档

可能很快就会有出路,我正在开发一个 Akka 扩展以包含静态类型的通道,但这将导致您必须以不同的方式编写代码,并使用更多类型注释。

于 2013-01-03T20:58:42.213 回答