Kompilator scala powinien generować ostrzeżenia dla instrukcji if, które skomentowałem poniżej, ale tak się nie dzieje. Czemu?Dlaczego kompilator scala nie generuje ostrzeżenia w przypadku instrukcji, które zawsze powodują fałsz w dopasowaniu wzorca?
sealed trait T
object A extends T
val s:Seq[T] = Seq(A)
val result = s.map {
//This if should produce a compiler warning
case a if(a == "A") =>
"First"
case a =>
//This if should produce a compiler warning
if (a == "A") {
"Second"
}
else
{
"Third"
}
}
Rezultatem będzie „trzecie”, jak można się spodziewać, ale kompilator powinien generowane ostrzeżenie na case a if(a == "A")
i na if (a == "A")
, ale niestety nie ma ostrzeżenia.
Jeśli piszę następujący kod zachowuje się jak bym się spodziewał:
if(A == "A"){
println("can't happen")
}
// warning: comparing values of types A.type and String using `==' will always yield false
Dlaczego tak się dzieje?
Edytuj: Używam Scala 2.10.1.
Wierzę, że podczas korzystania z pasujące do wzorca, trzeba określić typ dla każdego przypadku, w przeciwnym razie będzie pasowała do niczego. Spróbuj zmienić na "case a: A if (a ==" A ") => ...". – Felix
Próbowałem go z 'case a: T if (a ==" A ") =>' i nadal bez ostrzeżenia. – coltfred