Avatar
夕食でROMっててだいぶ乗り遅れたけど、 Covariant, Contravariant のシンプルな例 // このように Animal を継承した Cat, Dog があるときに class Animal { ... } class Cat: Animal { ... } class Dog: Animal { ... } // Covariant final class List<T> { // 戻り値の位置で T を利用 → Covariant get(at index: Int) -> T } let cats: List<Cat> = ... let animals: List<Animal> = cats // ✅ OK: なぜなら // ↓取り出された Cat インスタンスは Animal なので問題ない let animal: Animal = animals.get(at: 0) // Contravariant final class List<T> { // 引数の位置で T を利用 → Contravariant set(_ value: T, at index: Int) } let cats: List<Cat> = ... let animals: List<Animal> = cats // ⛔ NG: なぜなら // ↓ animals === cats に Dog インスタンスを set できて破綻 animals.set(Dog(), at: 0)
👍 2