variance
ある型Tと、それの部分型Sがあり、
C<T>とC<S>の部分型関係はどうなるのが型安全か?という話
Cの種類によって、C<S> <: C<T>となるべきだったり、C<T> <: C<S>となるべきだったりする
4種類ある
S <: TならばC<S> <: C<T>
S <: TならばC<T> <: C<S>
S <: TならばC<S> ≡ C<T>
以下のように捉えると直観に沿う
readする時は、covariantが必要
e.g. List<T>
writeする時は、contravariantが必要
e.g. 関数の引数
read/writeの両方を持ち合わせているものは、invariantである必要がある
e.g. Array<T>
参考
「変性」というまとまった章がある感じではない
15章で疎らに、共変や反変にふれる感じ
明示できる言語もある
Scala
+でcovariant
-でcontravariant
何もなしだと、invariant
code:scala
def apply(x: T): U
}
Kotlin
outでcovariant
inでcontravariant
何もなしだと、invariant
TypeSciprt
outでcovariant
inでcontravariant
in outで、invariant
「共変」とか「反変」とかいう単語が何も想起しなくて分かりづらい
語源?を知りたい
input/outputの話を図にしてるの初めて見たかも、いいですね
https://gyazo.com/1f4349965d7913a3d1faa854e04db331
出典のスライドがわからない