2009-10-07 3 views
5

나는 스칼라의 분산 액터로 놀고 있습니다. 아주 좋아.스칼라에서 0 인수 함수와 일치하는 패턴 : 경고로 신비화 됨

들어오는 기능 개체를 실행하는 서버가 있습니다. 예를 들어, 클라이언트는

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() 

같은 배우 코드를 실행할 수 있습니다하지만 난 '

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

가 어떻게이 경고까지 청소 할 수 있습니다 : 서버 코드 scalac에 의해 경고 메시지 출력에 의해 신비화 해요?

는 (나는 Unit 유형의 차이에 꽤 불분명 해요, 제로 인수 함수의 ()=>Unit 유형. 그냥 들어오는 작업과 일치하지 않는 사실은 경고없이를하는 reacttask:Unit 일치하도록 노력하고 있지만, .)

Debian에서 Scala 2.7.5를 사용하고 Sun의 Java6을 사용합니다.

답변

10

당신은 정말이 일치되어

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

을 인해 삭제하려면, 단위는 런타임에 표시되지 않습니다. 당신이 정말로 반환 형식에 대해 상관하지 않는 경우 , 당신은 반응 블록에서이 작업을 수행 할 수 있습니다

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

이 그의 대답은이 경우에 당신을 통과하기 때문에 @Mitch Blevins의 대답에 보완이다.

How do I get around type erasure on Scala? Or, why can’t I get the type parameter of my collections?을 참조하십시오. 아마도 액터에 터플 인 (Function0[T],Manifest[T])을 전달해야합니다. 아래에서 볼 수 있듯이 스칼라는 matchFunction(foo _)을 쓰더라도 T 유형을 추론 할만큼 똑똑합니다.

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 
관련 문제