理解scala';s_uu与任何/无
如果一个类有一个convariant类型参数,比如,声明理解scala';s_uu与任何/无,scala,wildcard,covariance,contravariance,type-systems,Scala,Wildcard,Covariance,Contravariance,Type Systems,如果一个类有一个convariant类型参数,比如,声明 def foo(bar: Iterable[_]) def foo(bar: Growable[_]) 及 ? 如果一个类有一个逆变类型参数,比如,声明 def foo(bar: Iterable[_]) def foo(bar: Growable[_]) 及 ?当泛型参数有界时,它确实会产生一些差异。例如,如果你有 class BoundedIterable[+A <: Something] class BoundedG
def foo(bar: Iterable[_])
def foo(bar: Growable[_])
及
?
如果一个类有一个逆变类型参数,比如,声明
def foo(bar: Iterable[_])
def foo(bar: Growable[_])
及
?当泛型参数有界时,它确实会产生一些差异。例如,如果你有
class BoundedIterable[+A <: Something]
class BoundedGrowable[-A >: Something]
类可编辑[+A:Something]
然后键入boundeditable[Any]
和BoundedGrowable[Nothing]
将是非法的
我不知道是否还有其他区别,但我可以肯定地说,只要可能,您应该更喜欢无通配符的变体。这是因为,实际上,声明站点类型差异的目的就是为了消除通配符(这是一种使用站点差异的形式)。当你说
List[Any]
时,你的意思是“列出任何事情”,但当你说List[\u]
时,你的意思是“列出我们不知道的事情”。因此,前者更为明确,即使它们在某些特定情况下可能是等价的。如果类型参数由某物
限定,我们可以简单地使用某物
代替任何
/无
。在这种情况下,我们可以编写def foo(bar:MyBoundedType[Something])
(对于协变和逆变两种情况)。@Peter这是真的。这就是为什么我称之为“一点”不同:)可能的重复不是一个精确的重复,但足够接近。我会让别人来判断。