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
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