Pet*_*lák 15 type-systems scala wildcard covariance contravariance
如果一个类有一个可变类型参数,例如Iterable[+A],声明之间是否有任何区别
def foo(bar: Iterable[_])
Run Code Online (Sandbox Code Playgroud)
和
def foo(bar: Iterable[Any])
Run Code Online (Sandbox Code Playgroud)
?
如果一个类具有逆变类型参数,例如Growable[-A],声明之间是否有任何区别
def foo(bar: Growable[_])
Run Code Online (Sandbox Code Playgroud)
和
def foo(bar: Growable[Nothing])
Run Code Online (Sandbox Code Playgroud)
?
当泛型参数有界时,它确实会有所不同.例如,如果你有
class BoundedIterable[+A <: Something]
class BoundedGrowable[-A >: Something]
Run Code Online (Sandbox Code Playgroud)
输入BoundedIterable[Any]并且BoundedGrowable[Nothing]是非法的.
我不知道是否还有其他差异,但我可以肯定地说,你应该尽可能地选择无通配符的变体.这是因为,实际上,声明站点类型差异的目的是摆脱通配符(这是一种使用站点方差的形式).当你说List[Any]你的意思是"任何事情的清单",但是当你说List[_]那时你的意思是"我们不知道什么的清单".所以前者更清楚,即使它们在某些特定情况下可能是等同的.