协变

package com.test.协变和逆变

/**
* 这是一个协变的例子
*/
/**
* 动物类,父类
*/
class Animal{

}

/**
* 子类继承父类
*/
class Bird extends Animal{

}

/**
* 吃东西的类
* @tparam T
*/
class EatSomething[+T](t:T)

object CovarianceDemo {
def main(args: Array[String]): Unit = {
//创建一个bird吃东西的类
var bird:EatSomething[Bird] = new EatSomething[Bird](new Bird)
//创建一个动物吃东西的类
//问题:能否将bird赋值给animal
//原因:尽管Bird是Animal的子类,
// 但是EatSomething[Bird]不是EatSomething[Animal]的子类,两者之间不具备继承关系
//解决:使用协变class EatSomething[+T](t:T),可以认为EatSomething[Bird]是EatSomething[Animal]的子类
var animal:EatSomething[Animal] = bird
}
}

逆变:

package com.test.协变和逆变

/**
* 这是一个逆变的例子
*/
//父类
class Animal{}
//子类鸟继承动物
class Bird extends Animal{}
//子类麻雀继承鸟
class Sparrow extends Bird{}
//吃东西的类
class EatSomething[-T](t:T){}

object ContravanceDemo {
//创建鸟吃东西的对象
val bird:EatSomething[Bird] = new EatSomething[Bird](new Bird)

//创建麻雀吃东西的对象
//问题:能否将bird赋值给sparrow
val sparrow:EatSomething[Sparrow] = bird
}