動機

突然遇到的觀念,紀錄一下

subtype

class Animal : Dog

畫成集合(Animal (Dog))

在subtype,大的可以能容納小的

Covariance

Covariance指的是下面的可以成立,就是left hand side > right hand side Animal obj = new Dog()

Contravariance

(Animal -> void) f
(Dog -> void) g
f = g # ??
g = f # good

有變數是一個函數只能吃Animal,Animal -> void 如果把Dog -> void,assign過去之後,有人丟Animal就直接起飛

因為明明是type decorator,卻讓看起來能容納的方向相反了!!

原本的變數就是一個集合,但是這裡套的是一個函數 函數是要求type,很像濾網,第一層type是Animal -> void,會讓Animal都進來,但如果函數是Dog -> void,就變成Animal放到Dog去,就一定報錯

這就是Contravariance,就是left hand side < right hand side

Covariance & Contravariance

其實就是看是哪個接資料,大的可以能容納小的

assign是left hand side去接資料 函數上實際接資料的是函數,所以其實是right hand side接資料

如果把函數的參數apply當成assign,所以就是看實際上在哪邊發生assign!!