在Scala中,是否缺少协方差的传递规则?

问题描述 投票:0回答:1

例如

  trait AA[+X[n], +Y] {

    def x: X[Y] // [Error]: covariant type Y occurs in invariant position in type => X[Y] of method x
  }

这似乎是错误的信息,因为 X[Y] 可以很容易地证明是协变的:

如果 Y1 >:> Y2, +X1[n] >:> +X2[n] 对于所有 n,则:

Y1 >:> Y2

(X2 的协方差)=> X2[Y1] >:> X2[Y2]

(X1[Y1] >:> X2[Y1]) => X1[Y1] >:> X2[Y2]

什么可能导致此错误消息?

scala generics covariance higher-kinded-types
1个回答
0
投票

你又少了一个

+
。正确的是

trait AA[+X[+n], +Y] {
  def x: X[Y]
}

那么类型

X
将是协变的(相对于其类型参数
n
)和位置

  def x: X[...]
//         ^^^  <- this position

将是协变的,你将能够在这个位置使用协变类型参数

Y

相反,您声明了不变类型

X
(w.r.t.
n
)并尝试在不变位置使用协变类型参数
Y

有不同的概念:

+X[n]
AA
的协变类型参数,但相对于类型参数
n
.

是不变类型
© www.soinside.com 2019 - 2024. All rights reserved.