如果类具有诸如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[_]
时,您的意思是“我们不知道的物品清单”。因此,即使在某些特定情况下它们可能是等效的,前者也更加清晰。