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