Consider this Map[String, Any]:
val m1 = Map(("k1" -> "v1"), ("k2" -> 10))
Now let’s write a for:
scala> for ((a, b) <- m1) println(a + b)
k1v1
k210
So far so good.
Now let’s specify the type of the second member:
scala> for ((a, b: String) <- m1) println(a + b)
k1v1
scala> for ((a, b: Integer) <- m1) println(a + b)
k210
Here, as I specify a type, filtering takes place, which is great.
Now say I want to use an Array[Any] instead:
val l1 = Array("a", 2)
Here, things break:
scala> for (v: String <- l1) println(v)
<console>:7: error: type mismatch;
found : (String) => Unit
required: (Any) => ?
My double question is:
- why doesn’t the second match filter as well?
- is there a way to express such filtering in the second scenario without using a dirty
isInstanceOf?
Well, the latter example doesn’t work because it isn’t spec’ed to. There’s some discussion as to what would be the reasonable behavior. Personally, I’d expect it to work just like you. The thing is that:
If you are not convinced by this, join the club. 🙂 Here’s a workaround:
Note that in Scala 3, you can: