2017-09-25 22 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の意味です)。 contravarianceについて考えるもう一つの方法は、それが「入力型」だということです。すなわち、型はメソッドのパラメータとして使用できますが、戻り値としては使用できません。

valとして宣言することで、クラスの外部から「出力値」としてアクセスできるようになりました。これは反変則のルールを破る。

Uをvalにする場合は、できるだけ共変()にするか、入力にする必要がある場合は不変にする必要があります。

+0

ありがとうございました! – redstone

関連する問題