键入成员和协方差

时间:2011-03-18 11:23:20

标签: scala covariance

我猜,“类型差异注释”(+-)无法应用于“类型成员”。为了向自己解释,我考虑了以下example

abstract class Box {type T; val element: T}

现在,如果我想创建课程StringBox,我必须扩展 Box

class StringBox extends Box { type T = String; override val element = ""}

所以我可以说Box #{1}}类型的协变。换句话说,具有类型成员的类在这些类型中是协变的。

有意义吗?
您如何描述类型成员和类型方差之间的关系?

1 个答案:

答案 0 :(得分:14)

Box在类型T中是不变的,但这并不意味着没有什么可看的。

abstract class Box {
  type T
  def get: T
}
type InvariantBox = Box { type T = AnyRef }
type SortofCovariantBox = Box { type T <: AnyRef }

改变方差情况的是该类型的暴露程度及其完成方式。抽象类型更不透明。但你应该在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)

等等。