В Scala дисперсия может быть определена с операторами дисперсии, такими как + и - в аргументе generic type. Например, тип List
является ковариантным в стандартной библиотеке.
class List[+A]
Таким образом, функцию с ковариантным списком можно определить следующим образом:
def foo[A](list : List[A])
Также дисперсия может быть эмулирована с помощью общих ограничений. Таким образом, мы также можем написать это
def foo[A](list : List[_:< A])
конечно, это не имеет смысла, потому что List
уже ковариантно. Но такой же трюк можно было бы сделать для типов, которые не являются ковариантными. (например, Stack
). Разумеется, новые типы могут быть созданы из стека (наследование агрегации), который является ковариантным.
Итак, мои вопросы:
- Когда следует использовать общие границы для дисперсии? И когда мы должны создать новый ковариантный тип?
- Являются ли общие границы полезными только для дисперсии или могут объявить больше (языковые понятия).
- Если они полезны только для дисперсии, то существуют ограничения только для совместимости с Java?
спасибо заранее:)