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

09-05 20:02