クラスに などの共変型パラメーターIterable[+A]
がある場合、宣言と宣言の間に違いはありますか
def foo(bar: Iterable[_])
と
def foo(bar: Iterable[Any])
?
クラスに などの反変型パラメーターGrowable[-A]
がある場合、宣言する間に違いはありますか
def foo(bar: Growable[_])
と
def foo(bar: Growable[Nothing])
?
クラスに などの共変型パラメーターIterable[+A]
がある場合、宣言と宣言の間に違いはありますか
def foo(bar: Iterable[_])
と
def foo(bar: Iterable[Any])
?
クラスに などの反変型パラメーターGrowable[-A]
がある場合、宣言する間に違いはありますか
def foo(bar: Growable[_])
と
def foo(bar: Growable[Nothing])
?
ジェネリック パラメーターがバインドされている場合は、少し違いがあります。たとえば、
class BoundedIterable[+A <: Something]
class BoundedGrowable[-A >: Something]
BoundedIterable[Any]
と入力BoundedGrowable[Nothing]
すると違法になります。
他に違いがあるかどうかはわかりませんが、可能な限りワイルドカードのないバリアントを好むべきだと言えます。これは、実際には、宣言サイト タイプの差異の目的そのものが、ワイルドカード (使用サイトの差異の一種) を取り除くことだからです。あなたが言うList[Any]
ときは「何かのリスト」を意味しますが、それを言うときList[_]
は「私たちが知らないもののリスト」を意味します. したがって、特定のケースでは同等である可能性がありますが、前者の方がはるかに明確です。