scala - match for types failed on Map -
i'm learning scala , trying write simple code.
when tried write method this:
def func(value: any) { value match { case i: int => println(1) case vector: vector[any] => println(2) case map: map[any, any] => println(3) case _ => println(4) } }
i got warn:
[warn]........:31: non-variable type argument in type pattern scala.collection.immutable.map[any,any] (the underlying of map[any,any]) unchecked since eliminated erasure [warn] case map: map[any, any] => println(3) [warn] ^ [warn] 1 warning found
i wondering why using map[any, any]
warn vector[any]
not.
the problem map[x, y]
not covariant in type parameter x
(but vector[x]
is).
what mean? suppose b <: a
(read, b
subtype of a
).
then have vector[b] <: vector[a]
. makes sense: if retrieve element x
vector[b]
, b
. means a
subtyping relationship. (a similar argument applies other methods.)
following similar reasoning, map[x, b] <: map[x, a]
x
(element retrieval key , not index, essentials remain same).
however, doesn't hold map
's first type parameter. assume map[b, x] <: map[a, x]
x
.
we following:
val x: map[b, x] = ??? x.get(b: b) // makes sense val y: map[a, x] = x // must ok, map[b, x] <: map[a, x] y.get(a: a) // bad! x doesn't know how "get" of type `a`
therefore, map[_, _]
not map[any, any]
. fix error message, use:
case map: map[_, _] => ...
Comments
Post a Comment