Подтвердить что ты не робот

Понимание scala _ vs Any/Nothing

Если класс имеет параметр convarant type, такой как Iterable[+A], есть ли разница между объявлением

def foo(bar: Iterable[_])

и

def foo(bar: Iterable[Any])

?


Если класс имеет параметр контравариантного типа, такой как Growable[-A], есть ли разница между объявлением

def foo(bar: Growable[_])

и

def foo(bar: Growable[Nothing])

?

4b9b3361

Ответ 1

Это делает небольшую разницу, когда общий параметр ограничен. Например, если у вас

class BoundedIterable[+A <: Something]
class BoundedGrowable[-A >: Something]

тогда введите BoundedIterable[Any] и BoundedGrowable[Nothing] будет незаконным.

Я не знаю, есть ли другая разница, но я могу с уверенностью сказать, что вам следует выбирать вариант без подстановочных знаков, где это возможно. Это потому, что на самом деле сама цель дисперсии типа объявления-сайта заключается в том, чтобы избавиться от подстановочных знаков (которые являются формой дисперсии использования-сайта). Когда вы говорите List[Any], вы имеете в виду "список чего угодно", но когда вы говорите List[_], значит, вы имеете в виду "список мы-не-знаем-что". Таким образом, первое является более понятным, хотя в каком-то конкретном случае они могут быть эквивалентны.