鉴于:
class Invar[T]
trait ExtendsAnyref extends AnyRef
def f(a: Invar[ExtendsAnyref]) = {}
以下是错误的
scala> val x: Function1[Invar[_ <: AnyRef], Unit] = f
<console>:13: error: type mismatch;
found : Invar[ExtendsAnyref] => Unit
required: Invar[_ <: AnyRef] => Unit
val x: Function1[Invar[_ <: AnyRef], Unit] = f
^
为什么?
我知道在 Scala 中,泛型类型默认具有非变体子类型。因此,在此示例的上下文中,Invar
具有不同类型参数的实例永远不会彼此处于子类型关系。所以 anInvar[ExtendsAnyref]
不能用作Invar[AnyRef]
.
_ <: AnyRef
但我对我理解的“AnyRef
类型层次结构中的 某种类型”的含义感到困惑。ExtendsAnyref
是类型层次结构中的某种类型AnyRef
,所以我希望Invar[ExtendsAnyref]
符合Invar[_ <: AnyRef]
.
我知道函数对象的输入参数类型是逆变的,但由于我使用Invar[_ <: AnyRef]
而不是Invar[AnyRef]
我理解,显然不正确,使用上限将具有“Invar
参数化Anyref
或其任何扩展”的含义。
我错过了什么?