Путаница в сопоставлении шаблонов Scala с Option [Any]

У меня есть следующий код Scala.

import scala.actors.Actor

object Alice extends Actor {
  this.start
  def act{
    loop{
      react {
        case "Hello" => sender ! "Hi"
        case i:Int => sender ! 0
      }
    }
  }
}
object Test {
  def test = {
    (Alice !? (100, "Hello")) match {
      case i:Some[Int] => println ("Int received "+i)
      case s:Some[String] => println ("String received "+s)
      case _ =>
    }
    (Alice !? (100, 1)) match {
      case i:Some[Int] => println ("Int received "+i)
      case s:Some[String] => println ("String received "+s)
      case _ =>
    }
  }
}

После выполнения Test.test я получаю результат:

scala> Test.test
Int received Some(Hi)
Int received Some(0)

Я ожидал результата

String received Some(Hi)
Int received Some(0)

Каково объяснение?

В качестве второго вопроса я получаю непроверенных предупреждений со следующим:

C:\scalac -unchecked a.scala
a.scala:17: warning: non variable type-argument Int in type pattern Some[Int] is unchecked since it is eliminated by erasure
      case i:Some[Int] => println ("Int received "+i)
             ^
a.scala:18: warning: non variable type-argument String in type pattern Some[String] is unchecked since it is eliminated by erasure
      case s:Some[String] => println ("String received "+s)
             ^
a.scala:22: warning: non variable type-argument Int in type pattern Some[Int] is unchecked since it is eliminated by erasure
      case i:Some[Int] => println ("Int received "+i)
             ^
a.scala:23: warning: non variable type-argument String in type pattern Some[String] is unchecked since it is eliminated by erasure
      case s:Some[String] => println ("String received "+s)
             ^
four warnings found

Как я могу избежать предупреждений?

РЕДАКТИРОВАТЬ: Спасибо за предложения. Идея Дэниела хороша, но, похоже, не работает с универсальными типами, как в приведенном ниже примере

def test[T] = (Alice !? (100, "Hello")) match { 
   case Some(i: Int) => println ("Int received "+i) 
   case Some(t: T) => println ("T received ") 
   case _ =>  
}

Обнаружено следующее предупреждение error : предупреждение: абстрактный тип T в шаблоне типа T не отмечен, поскольку он удаляется стиранием

33
задан Jus12 24 September 2010 в 21:07
поделиться