I guess, \"type variance annotations\" (+
and -
) cannot be applied to \"type members\". In order to explain it to myself I considered the following exa
Box is invariant in its type T, but that doesn't mean there's nothing to see.
abstract class Box {
type T
def get: T
}
type InvariantBox = Box { type T = AnyRef }
type SortofCovariantBox = Box { type T <: AnyRef }
What alters the variance situation is the degree to which the type is exposed and the manner it is done. Abstract types are more opaque. But you should play with these issues in the repl, it's quite interesting.
# get a nightly build, and you need -Ydependent-method-types
% scala29 -Ydependent-method-types
abstract class Box {
type T
def get: T
}
type InvariantBox = Box { type T = AnyRef }
type SortofCovariantBox = Box { type T <: AnyRef }
// what type is inferred for f? why?
def f(x1: SortofCovariantBox, x2: InvariantBox) = List(x1, x2)
// how about this?
def g[U](x1: Box { type T <: U}, x2: Box { type T >: U}) = List(x1.get, x2.get)
And etc.