Тип Члены и Ковариация - PullRequest
11 голосов
/ 18 марта 2011

Полагаю, «аннотации дисперсии типов» (+ и -) не могут быть применены к «элементам типа». Чтобы объяснить это себе, я рассмотрел следующий пример

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

Теперь, если я хочу создать класс StringBox, мне нужно расширить Box:

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

Итак, я могу сказать, что Box является естественно ковариантным по типу T. Другими словами, классы с членами типа являются ковариантными в этих типах.

Имеет ли это смысл?
Как бы вы описали отношения между членами типа и дисперсией типа?

1 Ответ

14 голосов
/ 19 марта 2011

Коробка инвариантна в своем типе T, но это не значит, что там нечего видеть.

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

Что изменяет ситуацию с отклонениями, так это степень, в которой тип подвергается воздействию, и то, как онсделанный.Абстрактные типы более непрозрачны.Но вам стоит поиграть с этими вопросами в репле, это довольно интересно.

# 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)

и т. Д.

...