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