Tengo el siguiente código de Scala.Confusión de coincidencia del patrón de Scala con la opción [Cualquiera]
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 _ =>
}
}
}
Después de hacer Test.test
, me sale la salida:
scala> Test.test
Int received Some(Hi)
Int received Some(0)
que estaba esperando la salida
String received Some(Hi)
Int received Some(0)
¿Cuál es la explicación?
Como una segunda pregunta, me sale unchecked
advertencias con lo anterior de la siguiente manera:
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
¿Cómo puedo evitar las advertencias?
EDIT: Gracias por las sugerencias. La idea de Daniel es agradable, pero no parece trabajar con tipos genéricos, como en el siguiente ejemplo
def test[T] = (Alice !? (100, "Hello")) match {
case Some(i: Int) => println ("Int received "+i)
case Some(t: T) => println ("T received ")
case _ =>
}
La siguiente
error se encuentra
advertencia: warning: abstract type T in type pattern T is unchecked since it is eliminated by erasure
Gracias! Las otras respuestas también son buenas, incluida la solución sugerida por Kevin. Pero esta parece ser la forma más elegante de arreglar mi código sin demasiada reescritura. – Jus12
¿Puede sugerir una solución similar para los tipos genéricos? como en: 'def test [T] = (Alice!? (100," Hello ")) match {case Some (t: T) => println (" T received "); case _ => println ("algo más recibido")} ' – Jus12
@ Jus12 De esa manera no funcionará. Tendrá que obtener un 'm: Manifiesto [T]', luego haga algo como 'case Some (t: T) if m.erasure.isAssignableFrom (t.getClass()) =>'. –