【问题标题】:Scala Actors: Returning a Future of a type other than Any.Scala Actors:返回非 Any 类型的 Future。
【发布时间】:2012-12-18 06:31:07
【问题描述】:

我正在阅读一本关于 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])?

【问题讨论】:

  • Akka 中,只需在ask 之后调用.mapTo[Int]!! 在您的代码中是ask),这会将Future[Any] 显式转换为Future[String]。我确定您的演员/Future-s 存在相同的方法
  • 另一个相关的SO问题可以找到here

标签: scala types actor future


【解决方案1】:

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

(actorRef ? m).mapTo[String]

这会将另一个 Future 链接到原始的 Future,如果该演员顽皮,则填充 String 结果,ClassCastException,如果演员未回复,则填充 TimeoutException,请参阅the Akka docs .

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

【讨论】:

  • Akka 类型的演员 (doc.akka.io/docs/akka/2.1.0/scala/typed-actors.html) 怎么样?我从未使用过它们,但它们不是您正在寻找的吗?无论如何,为了给感兴趣的人留下更多关于设计选择和理念的信息,请阅读这篇博文:letitcrash.com/post/19074284309/when-to-use-typedactors
  • @Rui Gonçalves 我也从未使用过它们,但似乎它们也提供运行时类型检查 - 否则会出现 implicit m: ClassManifest[T] 之类的东西。
  • TypedActor 使用代理,因此与普通对象和方法调用一样类型安全;他们在幕后进行动态类型的消息传递。但正如 Rui 所说,它们的适用性非常专业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多