If a class has a convariant type parameter such as Iterable[+A]
, is there any difference between declaring
def foo(bar: Iterable[_])
and
def foo(bar: Iterable[Any])
?
If a class has a contravariant type parameter such as Growable[-A]
, is there any difference between declaring
def foo(bar: Growable[_])
and
def foo(bar: Growable[Nothing])
?
It does make a little difference when generic parameter is bounded. For example, if you had
class BoundedIterable[+A <: Something]
class BoundedGrowable[-A >: Something]
then type BoundedIterable[Any]
and BoundedGrowable[Nothing]
would be illegal.
I don't know if there is any other difference, but I can say for sure that you should prefer the wildcard-less variant wherever possible. That is because, actually, the very purpose of declaration-site type variance is to get rid of wildcards (which are a form of usage-site variance). When you say List[Any]
you mean "list of anything", but when you say List[_]
then you mean "list of we-don't-know-what". So the former is just way more clear, even though they may be equivalent in some particular case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With