У меня есть следующий код Scala.Scala pattern confusion with 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 _ =>
}
}
}
После этого Test.test
, я получаю выход:
scala> Test.test
Int received Some(Hi)
Int received Some(0)
я ожидал выход
String received Some(Hi)
Int received Some(0)
Что такое объяснение?
В качестве второго вопроса, я получаю unchecked
предупреждения с вышеупомянутыми следующим образом:
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
Как я могу избежать предупреждений?
EDIT: Спасибо за предложения. Идея Даниила хороша, но не похоже на работу с родовыми типами, как в примере ниже
def test[T] = (Alice !? (100, "Hello")) match {
case Some(i: Int) => println ("Int received "+i)
case Some(t: T) => println ("T received ")
case _ =>
}
Следующая
ошибка
предупреждение встречается: warning: abstract type T in type pattern T is unchecked since it is eliminated by erasure
Спасибо! Другие ответы тоже хороши, в том числе обходное решение Кевина. Но это самый элегантный способ исправить мой код без большой перезаписи. – Jus12
Можете ли вы предложить подобное обходное решение для общих типов? как в: 'def test [T] = (Alice!? (100,« Hello »)) match {case Some (t: T) => println (« T получено »); case _ => println ("something else received")} ' – Jus12
@ Jus12 Этот способ не будет работать. Вам нужно получить 'm: Manifest [T]', а затем сделать что-то вроде 'case Some (t: T), если m.erasure.isAssignableFrom (t.getClass()) =>'. –