如果一个类有一个可变类型参数,比如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[_]
时候你的意思是“我们不知道什么的清单”。所以前者更清楚,即使它们在某些特定情况下可能是等价的。