J'ai le code Scala suivant.Scala motif confusion correspondant à l'option [Any]
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 _ =>
}
}
}
Après avoir fait Test.test
, je reçois la sortie:
scala> Test.test
Int received Some(Hi)
Int received Some(0)
j'attendais la sortie
String received Some(Hi)
Int received Some(0)
Quelle est l'explication?
En deuxième question, je reçois des avertissements unchecked
avec ce qui précède comme suit:
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
Comment puis-je éviter les mises en garde?
EDIT: Merci pour les suggestions. L'idée de Daniel est agréable mais ne semble pas fonctionner avec des types génériques, comme dans l'exemple ci-dessous
def test[T] = (Alice !? (100, "Hello")) match {
case Some(i: Int) => println ("Int received "+i)
case Some(t: T) => println ("T received ")
case _ =>
}
Ce qui suit
erreur
avertissement est rencontré: warning: abstract type T in type pattern T is unchecked since it is eliminated by erasure
Merci! Les autres réponses sont bonnes aussi, y compris la solution suggérée par Kevin. Mais cela semble être la façon la plus élégante de réparer mon code sans trop réécrire. – Jus12
Pouvez-vous suggérer une solution similaire pour les types génériques? comme dans: 'def test [T] = (Alice!? (100," Hello ")) match {case Quelques (t: T) => println (" T reçu "); case _ => println ("quelque chose d'autre reçu")} ' – Jus12
@ Jus12 Cette façon ne fonctionnera pas. Vous devrez obtenir un 'm: Manifest [T]', puis faire quelque chose comme 'case Some (t: T) si m.erasure.isAssignableFrom (t.getClass()) =>'. –