5

我正在和 scala 的分布式演员一起玩。非常好。

我有一个执行传入函数对象的服务器。例如,客户有

object Tasks {
  def foo = {Console.println("I am Foo")};
  def bar = {Console.println("I am Bar");}
}

// In client actor...
...
  server ! Tasks.foo _
...

服务器可以拾取这些并使用参与者代码执行它们,例如

react {
  case task:(()=>Unit) =>
    task()

这一切都很好(这确实非常酷),但我scalac对服务器代码输出的警告消息感到困惑:

warning: non variable type-argument Unit in type pattern is unchecked since it is eliminated by erasure
        case task:(()=>Unit) =>
                     ^

如何清除此警告?

(我很不清楚Unit类型和()=>Unit零参数函数的类型之间的区别。只是尝试匹配task:Unitreact没有警告的,但实际上与传入的任务不匹配。)

在 Debian 上使用 Scala 2.7.5 和 Sun 的 Java6。

4

2 回答 2

10

你真的很匹配这个:

case task:Function0[Unit] => task()

由于擦除,Unit 在运行时不可见。如果你真的不关心返回类型,你可以在 react 块中这样做:

case task:Function0[_] => task()
于 2009-10-07T23:22:41.097 回答
3

这是对@Mitch Blevins回答的补充,因为在这种情况下,他的回答会让您顺利通过。

请参阅如何绕过 Scala 上的类型擦除?或者,为什么我不能获取我的集合的类型参数?您可能必须将一个元组传递(Function0[T],Manifest[T])给演员。正如你在下面看到的,Scala 足够聪明,T即使你只写matchFunction(foo _).

scala> def foo = {Console.println("I am Foo")}
foo: Unit

scala> import scala.reflect.Manifest
import scala.reflect.Manifest

scala> def matchFunction[T](f: Function0[T])(implicit m : Manifest[T]) {
     |   (m,f) match {
     |     case (om: Manifest[_],of: Function0[_]) =>
     |       if(om <:< m) {
     |         of.asInstanceOf[Function0[T]]()
     |       }
     |   }
     | }
matchFunction: [T](() => T)(implicit scala.reflect.Manifest[T])Unit

scala> matchFunction(foo _)
I am Foo
于 2009-10-08T07:55:54.877 回答