2017-09-25 67 views
0

我有一个关于Scala变量的问题。val使用中的变化无效 - 错误:逆变类型U发生在协变位置

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

// <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>无效。有人能告诉我原因吗?

回答

2

您已声明U是不相容的(这就是-U的含义)。另一种考虑反变换的方式是它是一种“输入类型”。即。该类型可以用作方法的参数,但不能用作返回值。

通过将其声明为val,现在可以在类之外将其作为“输出值”访问。这打破了逆变的规则。

如果您希望使一个val为U,您必须或者使其协同(+U),如果可能的话,或者如果您需要它也是一个输入,它必须是不变的。

+0

谢谢你的回答! – redstone

相关问题