Scala—不变、协变、逆变

协变、逆变

  • 前提条件
    • 父子类
    • 正常的多态继承
  • 不变、协变、逆变
    • 不变
    • 协变
    • 逆变
  • 总结

前提条件

父子类

  class Animal{
    def eat(): Unit ={
      println("动物吃东西")
    }
  }

  class Cat extends Animal {    //猫科动物
    override def eat(): Unit = {
      println("猫科动物吃肉")
    }
  }

  class Tiger extends Cat {    //老虎属于猫科动物
    override def eat(): Unit = {
      println("老虎吃空气!!!")
    }
  }

正常的多态继承

def main(args: Array[String]): Unit = {
    val animal1:Animal = new Animal
    val animal2:Animal = new Cat;
    val animal3:Animal = new Tiger;
    val cat1:Cat = new Cat
    val cat2:Cat = new Tiger
    val tiger1:Tiger = new Tiger

Array不继承父子类的属性
在这里插入图片描述

Scala—不变、协变、逆变_第1张图片

不变、协变、逆变

不变

添加Invariant类

class Invariant[T]{} //不变

Scala—不变、协变、逆变_第2张图片

协变

class Covariant[+T]{} //协变

Scala—不变、协变、逆变_第3张图片

逆变

class Inversion[-T]{} //逆变

Scala—不变、协变、逆变_第4张图片

总结

不变
b虽然是a的儿子,假设他们都有一家公司,但 儿子b 的公司不是 老子a 公司的子公司

协变
n是m的儿子,假设他们都有一家工厂,儿子n 的工厂也是 老子m 公司的分工厂

逆变
x子是y的儿子,假设他们都有一家公司,儿子x 开了一家子公司,让 老子y 当董事长

你可能感兴趣的:(Scala,scala,开发语言,后端)