您的位置:首页 > 其它

scala的协变和逆变分析

2014-05-02 21:09 295 查看
首先引用朋友的文章
http://freewind.me/blog/20140502/2613.html
对于函数返回值引用声明为协变的对象定义

由于对象声明是正向扩展的,实际处理类型总比声明类型范围精确,则返回对象必然被声明对象兼容

trait Cat[+T] {
def meow: T
}

val child = new Cat[String] {
def meow:String = "miaomiao~~"
}
val parent: Cat[Any] = child

val voice:Any = parent.meow


我们可以看到,声明的Cat[Any]可以指向Cat[String],则voice必然可以引用到meow

对于函数返回值引用声明为逆变的对象定义

由于对象声明是反向收缩的,实际处理类型总比声明类型范围粗略,则返回对象必然会成为声明对象的兄弟对象,则不能处理。

trait Cat[-T] {
def meow: T
}

val child = new Cat[Any] {
def meow:Any = 123
}
val parent: Cat[String] = child

val voice:String = parent.meow  // error !!!


可以看到,声明的Cat[String]可以指向Cat[Any],但是因为Any的范围比String的范围粗略,则返回对象成了String的兄弟对象。

简单说,-T无法控制T的旁枝转型,T可以T1,T无法兼容T'

参数为逆变:参数可以处理比声明类型更精确的值。逆变则可以使的精确类型指向粗略类型

参数为逆变,意味着:我能处理比声明类型更精确的类型,只要更精确的类型是他的声明的类型的子类

返回值为协变,意味着:他能处理比我声明的类型更精确的类型,只要我的类型是他类型的子类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: