我对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>
无效。有人可以告诉我原因吗?
答案 0 :(得分:2)
您已声明U
是逆变的(-U
意味着什么)。另一种思考逆变的方法是它是一种输入类型&#34;。即。该类型可用作方法的参数,但不能用作返回值。
通过将其声明为val,它现在可以作为&#34;输出值&#34;在类之外访问。这打破了逆变规则。
如果你想让U
成为val,你必须使其成为协变(+U
),或者如果你需要它作为输入,它必须是不变的。