val使用中的方差无效 - 错误:逆变类型U出现在协变位置

时间:2017-09-25 14:14:24

标签: scala covariance variance contravariance

我对Scala差异有疑问。

下面的代码是有效代码,它通过编译。

// <Code A> 
// VALID (COMPILE PASS!)
class A[+T, -U](t: T, u: U)

但是下面的代码无效,使用val并且没有通过编译。

// <Code B>
// INVALID (COMPILE ERROR)
class A[+T, -U](val t: T, val u: U)

错误信息如下。

error: contravariant type U occurs in covariant position in type => U of value u
class A[+T, -U](val t: T, val u: U)
                                 ^

我想知道为什么<Code A>有效且<Code B>无效。有人可以告诉我原因吗?

1 个答案:

答案 0 :(得分:2)

您已声明U是逆变的(-U意味着什么)。另一种思考逆变的方法是它是一种输入类型&#34;。即。该类型可用作方法的参数,但不能用作返回值。

通过将其声明为val,它现在可以作为&#34;输出值&#34;在类之外访问。这打破了逆变规则。

如果你想让U成为val,你必须使其成为协变(+U),或者如果你需要它作为输入,它必须是不变的。