Aşağıdaki Scala kodum var.Seçenek [ile] Scala kalıbı eşleşmesi Seçenek [0]
scala> Test.test
Int received Some(Hi)
Int received Some(0)
Ben çıkışı
String received Some(Hi)
Int received Some(0)
açıklama nedir bekliyordum: Test.test
yaptıktan sonra
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 _ =>
}
}
}
ben Çıktı olsun?
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
nasıl uyarıları önleyebilirsiniz şu şekildedir:
ikinci soruya gelince, ben yukarıdaki ile unchecked
uyarı olsun?
DÜZENLEME: Öneriler için teşekkürler. Daniel'in fikri güzel ama uyarı karşılaşıldığında
hatası aşağıdaki
def test[T] = (Alice !? (100, "Hello")) match {
case Some(i: Int) => println ("Int received "+i)
case Some(t: T) => println ("T received ")
case _ =>
}
aşağıdaki örnekte olduğu gibi, genel türler ile çalışmak görünmüyor: warning: abstract type T in type pattern T is unchecked since it is eliminated by erasure
Teşekkürler! Kevin'in önerdiği çözüm de dahil olmak üzere diğer cevaplar da iyi. Ama bu, kodumu yeniden yazmadan düzeltmenin en zarif yolu gibi görünüyor. – Jus12
Genel türler için benzer bir çözüm önerebilir misiniz? olduğu gibi: 'def testi [T] = (Alice!? (100," Merhaba ")) {case Some (t: T) => println (" T received "); _ => println ("başka bir şey alındı")} ' – Jus12
@ Jus12 Bu yol çalışmaz. Bir "m: Manifest [T]" almanız gerekecek, daha sonra birşey yapmalısınız, eğer m.erasure.isAssignableFrom (t.getClass()) => 'ise. –