码迷,mamicode.com
首页 > 其他好文 > 详细

Scala 协变 和 逆变 二

时间:2015-04-13 19:12:47      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

Scala 协变 和 逆变 二


协变和逆变主要是用来解决参数化类型的泛化问题。由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系(可泛化),那被参数化的类型是否也可以泛化呢?Java中这种情况下是不可泛化的,然而Scala提供了三个选择,即协变、逆变和非变。下面说一下三种情况的含义,首先假设有参数化特征Queue,那它可以有如下三种定义。 

1)trait Queue[T] {} 

这是非变情况。这种情况下,当类型S是类型A的子类型,则Queue[S]不可认为是Queue[A]的子类型或父类型,这种情况是和Java一样的。 


2)trait Queue[+T] {} 

这是协变情况。这种情况下,当类型S是类型A的子类型,则Queue[S]也可以认为是Queue[A}的子类型,即Queue[S]可以泛化为Queue[A]也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。 


3)trait Queue[-T] {} 

这是逆变情况。这种情况下,当类型S是类型A的子类型,则Queue[A]反过来可以认为是Queue[S}的子类型。也就是被参数化类型的泛化方向与参数类型的方向是相反的,所以称为逆变。 


Scala 协变 和 逆变 二

标签:

原文地址:http://my.oschina.net/xinxingegeya/blog/400544

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!