scala的协变和逆变分析
2014-05-02 21:09
295 查看
首先引用朋友的文章
http://freewind.me/blog/20140502/2613.html
对于函数返回值引用声明为协变的对象定义
由于对象声明是正向扩展的,实际处理类型总比声明类型范围精确,则返回对象必然被声明对象兼容
我们可以看到,声明的Cat[Any]可以指向Cat[String],则voice必然可以引用到meow
对于函数返回值引用声明为逆变的对象定义
由于对象声明是反向收缩的,实际处理类型总比声明类型范围粗略,则返回对象必然会成为声明对象的兄弟对象,则不能处理。
可以看到,声明的Cat[String]可以指向Cat[Any],但是因为Any的范围比String的范围粗略,则返回对象成了String的兄弟对象。
简单说,-T无法控制T的旁枝转型,T可以T1,T无法兼容T'
参数为逆变:参数可以处理比声明类型更精确的值。逆变则可以使的精确类型指向粗略类型
参数为逆变,意味着:我能处理比声明类型更精确的类型,只要更精确的类型是他的声明的类型的子类
返回值为协变,意味着:他能处理比我声明的类型更精确的类型,只要我的类型是他类型的子类。
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'
参数为逆变:参数可以处理比声明类型更精确的值。逆变则可以使的精确类型指向粗略类型
参数为逆变,意味着:我能处理比声明类型更精确的类型,只要更精确的类型是他的声明的类型的子类
返回值为协变,意味着:他能处理比我声明的类型更精确的类型,只要我的类型是他类型的子类。
相关文章推荐
- scala的协变逆变,上界下界
- scala学习之协变逆变入门(一)
- scala类型系统:15) 协变与逆变
- Scala中List的构造是的类型约束逆变、协变、下界详解
- C#4.0新特性之协变与逆变实例分析
- Scala中的协变,逆变,上界,下界等
- scala 泛型之初解,定界,类型约束,逆变与协变
- Scala中的协变,逆变,上界,下界等
- scala的协变与逆变、上界与下界
- Scala中的协变,逆变,非变,上界,下界
- scala中的协变和逆变
- Scala的协变covariant(+),逆变contravariant(-),上界(<:),下界(>:)
- scala类型系统:协变与逆变
- Scala之协变和逆变
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变
- Scala类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用
- scala中的上界、下界、协变和逆变
- Scala进阶27-List中的上界、下界、逆变、协变
- 我来分析委托的协变与逆变
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变