При использовании нотации ковариации или общих границ в Scala

В Scala дисперсия может быть определена с помощью операторов дисперсии, таких как + и - для аргумента универсального типа. Например, тип List является ковариантным в стандартной библиотеке.

class List[+A]

Таким образом, функция с ковариантным списком может быть определена следующим образом:

def foo[A](list : List[A])

Также можно эмулировать дисперсию с помощью общих границ. Так что мы также можем написать это

def foo[A](list : List[_:< A])

, конечно, это не имеет смысла, потому что list уже ковариантен. Но тот же трюк можно проделать и с нековариантными типами. (например, Стек ). Конечно, новые типы также могут быть созданы из ковариантного стека (наследование агрегации).

Итак, мои вопросы:

  1. Когда следует использовать общие границы для дисперсии? И когда мы должны создать новый ковариантный тип?
  2. Общие границы полезны только для дисперсии, или они могут объявить больше (языковые концепции).
  3. Если они полезны только для дисперсии, ограничены только для совместимости с Java?

заранее спасибо :)

11
задан Julian 8 September 2010 в 00:01
поделиться