我猜,"类型方差注释"(+和-)不能应用于"类型成员".为了向自己解释,我考虑了以下示例
abstract class Box {type T; val element: T}Run Code Online (Sandbox Code Playgroud)
现在,如果我想创建类,StringBox 我必须扩展 Box:
class StringBox extends Box { type T = String; override val element = ""}Run Code Online (Sandbox Code Playgroud)
所以我可以说这在类型上Box是自然协变的T.换句话说,具有类型成员的类在这些类型中是协变的.
是否有意义 ?
您如何描述类型成员和类型方差之间的关系?
psp*_*psp 14
Box在T型中是不变的,但这并不意味着没有什么可看的.
abstract class Box {
type T
def get: T
}
type InvariantBox = Box { type T = AnyRef }
type SortofCovariantBox = Box { type T <: AnyRef }
Run Code Online (Sandbox Code Playgroud)
改变方差情况的是该类型暴露的程度及其完成方式.抽象类型更不透明.但你应该在repl中玩这些问题,这很有意思.
# 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)
Run Code Online (Sandbox Code Playgroud)
等等.