scala中的上界、下界、协变和逆变

class Pet(val name:String){
override def toString()=name
}
class Dog(override val name:String) extends Pet(name)
def workwithPets(pets:Array[Pet]){}


val dogs=Array(new Dog("Rover"),new Dog("Comet"))
workwithPets(dogs)//编译出错


//改写workwith方法
def workwithPets[T <: Pet](pets:Array[T])//T <: Pet表示T所代表的类派生自Pet,通过这种上界的语法表明具有参数类型T的
                                         //参数数组必须至少是Pet的数组,也可以是任何派生类的数组
workwithPets(dogs)//正确


将子类实例的容器赋给基类容器的能力成为协变,将父类实例的容器赋给子类容器的能力称为逆变,scala默认对二者都不支持
class MyList[+T]//...协变,-T称为逆变


var list1=new MyList[int]
var list2:MyList[Any]=null
list2=list1 //OK

你可能感兴趣的:(scala中的上界、下界、协变和逆变)