scala的协变和逆变分析

首先引用朋友的文章

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'



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


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

返回值为协变,意味着:他能处理比我声明的类型更精确的类型,只要我的类型是他类型的子类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值