I'm playing with scala's distributed actors. Very nice.
I have a server which executes incoming function objects. For example, the client has
object Tasks {
def foo = {Console.println("I am Foo")};
def bar = {Console.println("I am Bar");}
}
// In client actor...
...
server ! Tasks.foo _
...
And the server can pick these up and execute them with actor code like
react {
case task:(()=>Unit) =>
task()
This all works nicely (which is very very cool indeed) but I'm mystified by a warning message output by scalac
for the server code:
warning: non variable type-argument Unit in type pattern is unchecked since it is eliminated by erasure
case task:(()=>Unit) =>
^
How can I clean this warning up ?
(I'm pretty unclear on the difference between the Unit
type, and the ()=>Unit
type of zero-argument functions. Just trying to match task:Unit
in the react
is warning-free, but actually doesn't match the incoming tasks.)
Using Scala 2.7.5 on Debian, with Sun's Java6.
You are really matching this:
case task:Function0[Unit] => task()
Due to erasure, Unit is not visible at runtime. If you really don't care about the return type, you can do this in the react block:
case task:Function0[_] => task()
This is complement to @Mitch Blevins's answer since his answer will get you through in this case.
See How do I get around type erasure on Scala? Or, why can’t I get the type parameter of my collections? You probably have to pass around a tuple of (Function0[T],Manifest[T])
to the actor. As you can see below, Scala is smart enough to deduce the type of T
even if you just write 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With