当前位置: 首页 > news >正文

珠宝首饰网站源码最新的域名网站

珠宝首饰网站源码,最新的域名网站,360个人网站建设,优秀个人网站设计模板原文链接:http://hongjiang.info/scala-covariance-and-contravariance/#comment-4003 对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合 List[A]的子类型,那么就称为covariance(协变)&a…

原文链接:http://hongjiang.info/scala-covariance-and-contravariance/#comment-4003

对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合 List[A]的子类型,那么就称为covariance(协变),如果 List[A]是 List[B]的子类型,即与原来的父子关系正相反,则称为contravariance(逆变)

协变:

 _____               _____________ 
|     |             |             |
|  A  |             |  List[ A ]  |
|_____|             |_____________|^                       ^ |                       | _____               _____________ 
|     |             |             |
|  B  |             |  List[ B ]  |
|_____|             |_____________|  

逆变:

 _____               _____________ 
|     |             |             |
|  A  |             |  List[ B ]  |
|_____|             |_____________|^                       ^ |                       | _____               _____________ 
|     |             |             |
|  B  |             |  List[ A ]  |
|_____|             |_____________|  

如果一个类型支持协变或逆变,则称这个类型为variance(翻译为可变的或变型),否则称为invariant(不可变的)

在Java里,泛型类型都是invariant,比如 List<String> 并不是 List<Object> 的子类型。Java并不支持声明点变型(declaration-site variance,即在定义一个类型时声明它为可变型,也称definition-site),而scala支持,可以在定义类型时声明(用加号表示为协变,减号表示逆变),如:

trait List[+T] // 在类型定义时(declaration-site)声明为协变 

这样会把List[String]作为List[Any]的子类型。

不过Java支持使用点变型(use-site variance),所谓“使用点“,也就是在声明变量时:

List<? extends Object> list = new ArrayList<String>();

scala为了兼容java泛型通配符的形式,引入存在类型(existential type,后边再讲)时,也支持了使用点变型(use-site variance)

scala> val a : List[_ <: Any] = List[String]("A")
a: List[_] = List(A)    

要注意variance并不会被继承,父类声明为variance,子类如果想要保持,仍需要声明:

scala> trait A[+T]scala> class C[T] extends A[T]  // C是invariant的scala> class X; class Y extends X;scala> val t:C[X] = new C[Y]
<console>:11: error: type mismatch; found   : C[Y]required: C[X]
Note: Y <: X, but class C is invariant in type T.
You may wish to define T as +T instead. (SLS 4.5)

必须也对C声明为协变的才行:

scala> class C[+T] extends A[T]scala> val t:C[X] = new C[Y]
t: C[X] = C@6a079142

对于协变与逆变的使用,参考《Effective Java》的PECS原则。这里有篇旧文也可供参考。


http://www.lbrq.cn/news/2364571.html

相关文章:

  • 蒙城做网站西点培训学校
  • 常州建设网站最新国际足球世界排名
  • 美食个人网站设计作品关键词首页排名代做
  • 哪个网站上网好友情链接样式
  • mac和windows做网站浙江seo外包费用
  • 黄埔网站建设公司上海好的网络推广公司
  • 杭州建设企业网站的淘宝seo对什么内容优化
  • 服务器搭建网站方案500字湖南seo服务
  • 如何用wd做网站设计资源网站优化排名软件
  • 网络科技公司网站seo是谁
  • 大米网站模板域名大全
  • 电子商务目前就业形势优化网站技术
  • 房产信息网显示已备案是什么意思广州百度seo优化排名
  • 亚马逊海外版网站新媒体营销推广公司
  • 心理网站开发背景百度竞价点击软件
  • ip达1万的网站怎么做腾讯企点qq
  • asp.net做网站实例关键词优化的五个步骤
  • 成都前十名传媒网站建设网络平台推广方案
  • 给公司做一个网站流程软件培训班学费多少
  • 美工网站做兼职南京seo整站优化技术
  • 网站最近收录怎么开一个网站平台
  • 100款免费软件网站大全兰州seo公司
  • 做网站学的是代码吗seo快速排名软件品牌
  • 购物网站设计理念买卖交易网
  • 安庆市城乡建设网站爱战网关键词挖掘查询工具
  • 全国二级建造师查询网站制作网站需要什么技术
  • 个人优秀网站苏州seo关键词优化排名
  • 个人电脑做服务器网站百度推广怎么样才有效果
  • 建手机端网站常州seo关键词排名
  • 重庆网站编辑职业学校关键词排名查询工具有什么作用?
  • MailAgentProcess.getInstance
  • 阿里云-通义灵码:隐私保护机制—为数据安全筑起铜墙铁壁
  • 了解一下Unity Object的内存管理机制
  • UniApp 多端人脸认证图片上传实现
  • 2025年C++后端开发高频面试题深度解析:线程安全LRU缓存设计与实现
  • 李宏毅《生成式人工智能导论》 | 第9讲 AI Agent