2009-10-07 5 views
5

Tôi đang chơi với các diễn viên phân tán của scala. Rất đẹp.Mẫu khớp với các hàm không đối số trong scala: được cảnh báo bằng cách cảnh báo

Tôi có một máy chủ thực hiện các đối tượng hàm đến. Ví dụ, khách hàng có

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

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

Và máy chủ có thể chọn những lên và thực hiện chúng với mã diễn viên như

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

bài này hoạt động độc đáo (mà là rất rất mát mẻ thực sự) nhưng tôi m bị bí ẩn bởi một thông báo cảnh báo đầu ra bởi scalac cho mã máy chủ:

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

Làm cách nào để làm sạch cảnh báo này?

(tôi khá rõ ràng về sự khác biệt giữa các loại Unit, và loại ()=>Unit chức năng zero-tranh cãi. Chỉ cần cố gắng để phù hợp với task:Unit trong react được cảnh báo miễn phí, nhưng thực sự không phù hợp với nhiệm vụ đến .)

Sử dụng Scala 2.7.5 trên Debian, với Java6 của Mặt trời.

Trả lời

10

Bạn đang thực sự phù hợp với điều này:

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

Do tẩy xoá, đơn vị không hiển thị khi chạy. Nếu bạn thực sự không quan tâm đến các kiểu trả về, bạn có thể làm điều này trong khối phản ứng:

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

Đây là bổ sung cho đến @Mitch Blevins 's câu trả lời từ câu trả lời của mình sẽ giúp bạn có được thông qua trong trường hợp này.

Xem How do I get around type erasure on Scala? Or, why can’t I get the type parameter of my collections? Bạn có thể phải vượt qua một bộ tóan (Function0[T],Manifest[T]) cho tác nhân. Như bạn có thể thấy bên dưới, Scala đủ thông minh để suy ra loại T ngay cả khi bạn chỉ viế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