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の型の違いはよくわかりません。 で一致させようとしても警告は発生しませんが、実際には着信タスクと一致しません。)()=>Unittask:Unitreact

Sun の Java6 を使用して、Debian で Scala 2.7.5 を使用します。

4

2 に答える 2

10

あなたは本当にこれに一致しています:

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

消去のため、ユニットは実行時に表示されません。リターンタイプを本当に気にしない場合は、reactブロックでこれを行うことができます。

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

これは、@Mitch Blevinsの回答を補完するものです。この場合、彼の回答で解決できるからです。

Scala で型消去を回避するにはどうすればよいですか? を参照してください。または、コレクションの型パラメーターを取得できないのはなぜですか? おそらく(Function0[T],Manifest[T])、アクターに のタプルを渡す必要があります。T以下に示すように、Scala はと書いただけでもの型を推測できるほどスマートです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 に答える