如果某个类具有可变类型参数,例如Iterable[+A]
,则声明之间是否有任何区别
def foo(bar: Iterable[_])
和
def foo(bar: Iterable[Any])
如果某个类具有逆变类型参数,例如Growable[-A]
,则声明之间是否有任何区别
def foo(bar: Growable[_])
和
def foo(bar: Growable[Nothing])
答案 0 :(得分:5)
当泛型参数有界时,确实会有所不同。例如,如果你有
class BoundedIterable[+A <: Something]
class BoundedGrowable[-A >: Something]
然后输入BoundedIterable[Any]
和BoundedGrowable[Nothing]
将是非法的。
我不知道是否还有其他差异,但我可以肯定地说,您应该尽可能地选择无通配符的变体。这是因为,实际上,声明站点类型差异的目的是摆脱通配符(这是一种使用站点方差的形式)。当你说List[Any]
时,你的意思是“任何事情的清单”,但当你说List[_]
时,你的意思是“我们不知道什么的清单”。所以前者更清楚,即使它们在某些特定情况下可能是相同的。