2009-10-07 16 views
5

Gram z rozproszonymi aktorami scala. Bardzo dobrze.Wzorzec dopasowujący funkcje zerowego argumentu w scala: mistyfikowany przez ostrzeżenie

Mam serwer, który wykonuje przychodzące obiekty funkcji. Na przykład, klient ma

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

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

a serwer może odebrać je i wykonać je z kodem aktora jak

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

To wszystko działa dobrze (co jest rzeczywiście bardzo fajne), ale I” m mystified przez wyjście komunikatu ostrzegawczego przez scalac kodu serwera:

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

Jak mogę czyścić ostrzegawczy w górę?

(jestem całkiem jasne na różnicy między typem Unit i rodzaj funkcji zero argumentów ()=>Unit. Tylko próbując dopasować task:Unit w react ostrzega wolne, ale w rzeczywistości nie odpowiada na przychodzące zadania .)

Używanie Scala 2.7.5 na Debianie, z Sun6 Java.

Odpowiedz

10

Jesteś naprawdę dopasowanie to:

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

związku z usunięciem, urządzenie nie jest widoczne przy starcie. Jeśli naprawdę nie dbam o rodzaju powrotnej, można to zrobić w bloku reagować:

case task:Function0[_] => task() 
3

Jest to uzupełnienie do @Mitch Blevins „s odpowiedź od jego odpowiedź będzie Ci dzięki w tym przypadku.

Zobacz How do I get around type erasure on Scala? Or, why can’t I get the type parameter of my collections? Prawdopodobnie musisz przekazać aktorowi krotkę (Function0[T],Manifest[T]). Jak widać poniżej, Scala jest wystarczająco inteligentna, aby wydedukować typ T, nawet jeśli po prostu napiszesz 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