`

scala中的variance

 
阅读更多
定义:
两个泛型类
class A[type_a]
class B[type_b]
如果 type_a是type_b 的 父类 那么A也是B的父类,那么就称之为 convariance(协变);
如果 type_a是type_b 的 父类 A是B的子类,那么就称之为 contravariance(逆变);

如果一个类型支持协变或逆变,则称这个类型为variance(翻译为可变的或变型),否则称为invariant(不可变的)。
在Java里,泛型类型都是invariant,比如 List<String> 并不是 List<Object> 的子类型。不过Java支持使用点变型(use-site variance),所谓“使用点“,也就是在声明变量时:
List<? extends Object> list = new ArrayList<String>();
//scala中的写法
scala> val a : List[_ <: Any] = List[String]("A")


有一点要注意:父类是variance,如果子类继承父类,需要声明为协变,不然默认不是协变类型。
例如
class A[+type_a] 是convariance

声明 class B extends class A 
那么 class B 默认是 不可变的(invariance)
class A[T+]
class B[T] extends A[T]
class C
class D extends C
//这种写法是错误的因为B[C] 不是B[D]的父类
val b:B[C] = new B[D]

class A[+T]
class B[+T] extends A[+T]
class C
class D extends C
//这种写法是正确的
val b:B[C] = new B[D]


里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。
class A[+T]{
def fun(x:A){.....}
}

我们来分析下上面的代码
例如
class A(String){def fun(x:String)}
class A(Object){def fun(x:Object)}

可以看到 A(Object) 是 A(String) 的父类 那么问题来了,里氏替换原则说fun方法中子类能替换父类,但是如果Object是一个具体的对象,并不是String类型,则就会报错。因为父类做的事情,子类不能完全胜任,只能部分满足,是无法代替父类型的。

怎么解决呢
class A[-T]{
def fun(x:T){.....}
}

如此定义之后 A(Object) 是 A(String) 的子类,这样String 就可以用 object替换了。

同理我们再定义一个类
class A[+T]{
def fun:T{.....}
}


我们来分析下上面的代码
例如
class A(String){def fun:String=...}
class A(Object){def fun:Object=...}

可以看到 A(Object) 是 A(String) 的父类,里氏替换原则说fun方法中子类能替换父类.子类方法得到的结果比父类更“具象”一些,也就是说子类方法的处理能力更强一些。
综上所述
方法中的参数类型声明时必须符合逆变(或不变),以让子类方法可以接收更大的范围的参数(处理能力增强);而不能声明为协变,子类方法可接收的范围是父类中参数类型的子集(处理能力减弱)。
方法返回值的位置称为协变点(covariant position)。同理,A类型声明协变(或不变),编译时符合要求;

0
2
分享到:
评论

相关推荐

    头歌Scala中集合的使用

    Scala中集合的使用 大学生 1. List 列表的使用 2. Set 集合的使用 3.Map 映射的使用 4. 元组的使用

    Scala_中文学习资料_含Scala_2.7.6_API.rar

    Scala_中文学习资料_含Scala_2.7.6_API.rar。Scala_中文学习资料_含Scala_2.7.6_API.rar。

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    scala 中文学习 入门与进阶

    scala.chm 中文学习 入门与进阶, 以及用到的构建工具与测试工具

    scalgos, Scala 中的算法.zip

    scalgos, Scala 中的算法 目标学习 ScalaText 实现惯用函数 Scala 中常用算法没有外部依赖项( 除了测试的specs2 )良好的测试和文档建筑安装 git,Scala 和 sbt: brew install git s

    scala编程中文

    scala编程中文版本(33章全)。大数据必备参考书箱。非常适合初学者的一本书,这本书的作者就是scala语言的创始人

    programing in scala中文版的scala教程哦

    programing in scala中文版的scala教程哦。

    scala-xml_2.11-1.0.1-API文档-中文版.zip

    赠送jar包:scala-xml_2.11-1.0.1.jar; 赠送原API文档:scala-xml_2.11-1.0.1-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.1-sources...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    scala + mybatis 数据库查询

    这是一个简单实用的scala集成mybatis数据库查询代码,简单明了

    scala-reflect-2.12.10-API文档-中文版.zip

    赠送jar包:scala-reflect-2.12.10.jar; 赠送原API文档:scala-reflect-2.12.10-javadoc.jar; 赠送源代码:scala-reflect-2.12.10-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    scala-compiler-2.12.7-API文档-中文版.zip

    赠送jar包:scala-compiler-2.12.7.jar; 赠送原API文档:scala-compiler-2.12.7-javadoc.jar; 赠送源代码:scala-compiler-2.12.7-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    scala-reflect-2.12.7-API文档-中文版.zip

    赠送jar包:scala-reflect-2.12.7.jar; 赠送原API文档:scala-reflect-2.12.7-javadoc.jar; 赠送源代码:scala-reflect-2.12.7-sources...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    快学Scala.中文完整版

    中文版scala。《快学Scala》是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程语言的特性结合在一起的编程语言。你可以使用Scala编写出更加精简的程序,同时充分利用并发的威力。由于Scala运行于JVM...

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    scala-reflect-2.11.8-API文档-中文版.zip

    赠送jar包:scala-reflect-2.11.8.jar; 赠送原API文档:scala-reflect-2.11.8-javadoc.jar; 赠送源代码:scala-reflect-2.11.8-sources...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Scala中文版

    当下热门技术大数据,衍生出很多的技术,有心之人将这些书籍整理,共享出来.

    scala 中文教程下载

    scala 中文教程下载 ,15章,介绍了基础语法,大家可以一边看例子,一边熟悉scala .

Global site tag (gtag.js) - Google Analytics