Scala参与者:返回一个不同于任何类型的未来。

Scala参与者:返回一个不同于任何类型的未来。,scala,types,actor,future,Scala,Types,Actor,Future,我正在读一本关于Scala演员的书,我遇到了一些语法上的问题。实际上,我倾向于分配变量和函数定义如下: val v: String = "blahblahblah" def f(n: Int): Int = n+1 在项目名称后包含项目的(返回)类型。虽然我知道这不是必需的,但我已经习惯了这种约定,并发现它使代码更容易被我自己理解。 尽管如此,请观察以下示例: class Server extends Actor { def act() = { while (true) {

我正在读一本关于Scala演员的书,我遇到了一些语法上的问题。实际上,我倾向于分配变量和函数定义如下:

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[Any])

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

(actorRef ? m).mapTo[String]
这将把另一个未来链接到原始的未来,如果参与者淘气,则使用
字符串
结果、
ClassCastException
填充,如果参与者没有回复,则使用
TimeoutException
填充,请参阅


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

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

(actorRef ? m).mapTo[String]
这将把另一个未来链接到原始的未来,如果参与者淘气,则使用
字符串
结果、
ClassCastException
填充,如果参与者没有回复,则使用
TimeoutException
填充,请参阅


可能很快就会有出路,我正在开发一个Akka扩展以包括静态类型的频道,但这将导致您不得不编写稍微不同的代码,使用更多的类型注释。

Akka
中,只需在
ask
之后调用
.mapTo[Int]
!!
ask
在您的代码中),这将显式地将
Future[Any]
转换为
Future[String]
。我确信你的演员也有同样的方法/
Future
-其他相关问题可以在
Akka
中找到,只需在
ask
之后调用
.mapTo[Int]
!!
在你的代码中是
ask
),这将明确地将
Future[Any]
转换为
Future[String]
。我确信对于您的参与者/
未来
-sAnother相关的问题也存在相同的方法,所以可以找到关于Akka类型的参与者()的问题?我从未使用过它们,但它们不是你正在寻找的吗?无论如何,为了给感兴趣的人留下更多关于设计选择和理念的信息,请阅读这篇博文:。@Rui Gonçalves Me也从未使用过它们,但它们似乎还提供了运行时类型检查-否则会出现类似
implicit m:ClassManifest[T]
的内容。TypedActor使用代理,因此,它们与普通对象和方法调用一样具有类型安全性;在引擎盖下,他们进行动态类型的消息传递。但正如芮所提到的,它们的适用性是相当专业的?我从未使用过它们,但它们不是你正在寻找的吗?无论如何,为了给感兴趣的人留下更多关于设计选择和理念的信息,请阅读这篇博文:。@Rui Gonçalves Me也从未使用过它们,但它们似乎还提供了运行时类型检查-否则会出现类似
implicit m:ClassManifest[T]
的内容。TypedActor使用代理,因此,它们与普通对象和方法调用一样具有类型安全性;在引擎盖下,他们进行动态类型的消息传递。但正如芮所提到的,它们的适用性相当专业化。