15

如果一个类有一个可变类型参数,比如Iterable[+A],那么声明

def foo(bar: Iterable[_])

def foo(bar: Iterable[Any])

?


如果一个类有一个逆变类型参数,比如Growable[-A],那么声明之间有什么区别吗

def foo(bar: Growable[_])

def foo(bar: Growable[Nothing])

?

4

1 回答 1

5

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

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

然后键入BoundedIterable[Any]并且BoundedGrowable[Nothing]将是非法的。

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

于 2013-03-09T13:05:48.393 回答