了解scala的_ vs Any / Nothing

时间:2013-03-09 11:50:15

标签: scala wildcard covariance contravariance type-systems

如果某个类具有可变类型参数,例如Iterable[+A],则声明之间是否有任何区别

def foo(bar: Iterable[_])

def foo(bar: Iterable[Any])


如果某个类具有逆变类型参数,例如Growable[-A],则声明之间是否有任何区别

def foo(bar: Growable[_])

def foo(bar: Growable[Nothing])

1 个答案:

答案 0 :(得分:5)

当泛型参数有界时,确实会有所不同。例如,如果你有

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

然后输入BoundedIterable[Any]BoundedGrowable[Nothing]将是非法的。

我不知道是否还有其他差异,但我可以肯定地说,您应该尽可能地选择无通配符的变体。这是因为,实际上,声明站点类型差异的目的是摆脱通配符(这是一种使用站点方差的形式)。当你说List[Any]时,你的意思是“任何事情的清单”,但当你说List[_]时,你的意思是“我们不知道什么的清单”。所以前者更清楚,即使它们在某些特定情况下可能是相同的。