2017-09-25 118 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

相關問題