位置: IT常识 - 正文

Scala-泛型(scala实例)

编辑:rootadmin
泛型 泛型定义 Scala的泛型和Java中的泛型表达的含义都是一样的,对处理的数据类型进行约束,但是Scala提供了更加强大的功能 scala中的泛型采用中括号 scala中的泛型是不可变的 泛型和类型不是一个层面的东西 所以scala中泛型和类型无法联合使用 泛型语法 如果能将类型和泛型当成一个 ... 泛型泛型定义

推荐整理分享Scala-泛型(scala实例),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:scala when,csharp泛型,csharp泛型,scala实例,scala中_,scala泛型函数,csharp泛型,scala 类,内容如对您有帮助,希望把文章链接给更多的朋友!

Scala的泛型和Java中的泛型表达的含义都是一样的,对处理的数据类型进行约束,但是Scala提供了更加强大的功能

scala中的泛型采用中括号

scala中的泛型是不可变的

泛型和类型不是一个层面的东西

所以scala中泛型和类型无法联合使用

泛型语法

如果能将类型和泛型当成一个整体来使用的话,那不就方便了吗?

如果将类型和泛型联合使用,那么类型相同时,如果泛型存在父子类关系,那么联合的类型也就存在父子类关系,这个操作其实就是一种变化,称之为协变, +T

Scala-泛型(scala实例)

如果类型相同,泛型之间存在父子关系,那么让联合后的类型存在子父关系。这个操作其实也是一种变化,称之为逆变, -T

val message1 : Message[Child] = new Message[Child]()val message2 : Message[Child] = new Message[Parent]()//val message3 : Message[Child] = new Message[SubChild]() -- 不符合新的父子关系// Child(父) -> child -> SubChild(子)// MessageChild(子) MessageSubChild(父)// Child(子) Parent(父)// MessageChild(父) MessageParent(子)class Message[-T] {}class Parent {}class Child extends Parent {}class SubChild extends Child {}泛型和类型的区别所谓的类型,其实就是对外部的数据做约束所谓的泛型,其实就是对内部的数据做约束泛型特征

泛型和类型的层次不一样。不能作为整体来考虑

泛型在某些场合中,其实就是类型参数,用于向类中传递参数

Test<User> userTest = new Test<User>(); final User t = userTest.t; Test userTest1 = new Test(); final Object t1 = userTest1.t;

泛型其实只在编译时有效, 将这个操作称之为"泛型擦除"

Test<User> userTest = new Test<User>(); userTest.t = new Emp(); //--> error System.out.println(userTest);

泛型主要目的是为了约束内部数据的类型

List list = new ArrayList(); list.add(new Emp()); List<User> userList = list; // System.out.println(userList); for ( User user : userList ) {}

泛型和类型不是一个层次,泛型没有所谓的父子关系

public static void main(String[] args) { List<String> stringList = new ArrayList<String>(); test(stringList); //--> error List<Object> stringList1 = new ArrayList<Object>(); test(stringList1);}public static void test( Collection<Object> list ) { System.out.println(list);}

泛型的不可变

public static void main(String[] args) { // TODO 6. 泛型的不可变 List<Child> childList = new ArrayList<Child>(); //--> error List<Child> childList1 = new ArrayList<Parent>(); //--> error List<Child> childList2 = new ArrayList<SubChild>(); } } class Parent { } class Child extends Parent { } class SubChild extends Child { }

为了使用方便,可以定义泛型的边界

public static void main(String[] args) { Producer<Child> p = new Producer<Child>(); p.produce(new Message<Child>()); p.produce(new Message<Parent>()); p.produce(new Message<SubChild>()); //--> error Consumer<Child> c = new Consumer<Child>(); final Message<? extends Child> message = c.getMessage(); final Child data = message.data;}class Message<T> { public T data;}// 分别给消费者和生产者设置上限与下限class Producer<A> { public void produce( Message<? super A> message ) { }}class Consumer<B> { public Message<? extends B> getMessage() { return null; }}泛型的上限与下限

Scala的泛型可以根据功能设定类树的边界

这里的上限和下限采用的是颜文字

def main(args: Array[String]): Unit = { val p = new Producer[Child] p.produce(new Message[Child]) p.produce(new Message[Parent]) p.produce(new Message[SubChild]) // --> error val c = new Consumer[Child] val m: Message[_ <: Child] = c.consume() val data: Child = m.data } class Message[T] { var data : T = _ } class Parent {} class Child extends Parent {} class SubChild extends Child {}// 设置上限与下限 class Producer[T] { def produce( message : Message[_ >: T] ): Unit = { } } class Consumer[T] { def consume(): Message[_ <: T] = { null } }集合的泛型

使用时需甄别源码 看是否有上限下限

def main(args: Array[String]): Unit = { val list : List[Child] = List( new Child(), new Child(), new Child() ) // 集合中函数要遵守继承 list.fold[Parent](new Parent)( (x,y) => x ) // 但left不需要考虑继承 list.foldLeft[SubChild](new SubChild)((x, y) => x) }class Parent {}class Child extends Parent {}class SubChild extends Child {}上下文限定

上下文限定是将泛型和隐式转换的结合产物,以下两者功能相同,使用上下文限定[A : Ordering]之后,方法内无法使用隐式参数名调用隐式参数,需要通过implicitly[Ordering[A]]获取隐式变量,如果此时无法查找到对应类型的隐式变量,会发生出错误。

object ScalaGeneric { def main(args: Array[String]): Unit = { def f[A : Test](a: A) = println(a) implicit val test : Test[User] = new Test[User] f( new User() ) } class Test[T] { } class Parent { } class User extends Parent{ } class SubUser extends User { }}
本文链接地址:https://www.jiuchutong.com/zhishi/312034.html 转载请保留说明!

上一篇:织梦cms批量取消审核文档的实现方法(织梦系统如何更换网站内容)

下一篇:python中chr()函数怎么用?(python中chr函数介绍)

  • 天猫提现一直没到账
  • 税金及附加要计入本年利润吗
  • 未确认融资收益对应的科目是什么
  • 技术服务费怎么结转成本
  • 软件开发增值税免税吗
  • 预算分配比例与国库不一样
  • 票据到期兑付会怎么样
  • 发票领购簿遗失怎么办
  • 或有负债怎么入账
  • 公司垫付员工工资怎么做账
  • 办理产权证费用明细
  • 已认证抵扣的进项发票,次月开具红字发票信息表,凭证
  • 小企业核算其它货币资金包括哪些?
  • 收回员工社保入什么科目
  • 负债减少在什么方
  • 跨地区经营怎么交税
  • 电子发票一定要入账吗
  • 招商引资政府返税政策不兑现
  • 定额发票2019年规定
  • 房地产企业回迁房税收规定
  • 制造费用和劳务成本
  • 集体企业属于事业单位吗
  • 作废代开发票,是否退还已纳税款?
  • 房屋融资租赁会计处理
  • 动漫软件公司的发展前景
  • windows7中右键的作用
  • 私户给公户转账多久到账
  • 其它权益工具投资处置时其他综合收益转那
  • 宽带连接错误651是什么意思
  • 销货退回与折让是什么
  • windows7便签删除了怎么恢复
  • 其他业务收入产品包括
  • PHP:finfo_buffer()的用法_fileinfo函数
  • 前端没思路怎么办
  • php模板引擎执行时间
  • linux如何搭建
  • 服务行业的进项
  • 借入资金用于生产经营
  • 精灵图的使用
  • 基建工程转固定资产
  • 银行账号未备案怎么解决
  • 每年结息一次,到期一次还本是单利
  • 研发费用没有发票怎么做账
  • 车辆保险费怎么入账
  • 投稿网址打不开
  • 滴滴票可以抵扣吗?
  • 销售部门发生的商品维修费
  • 发票丢失了怎么报销
  • 应收票据贴现的会计处理
  • 固定资产折旧的影响因素
  • 进项税留抵怎么做分录
  • 三包适用范围
  • 车船使用税和印花税谁交
  • 公司代缴社保如何查询
  • 小企业固定资产折旧方法
  • 房屋租赁合同印花税怎么计算
  • 收入分成的账务处理
  • 工程款发票开给委托方要如何处理?
  • 收到免税发票会计分录
  • 职工教育经费中的职工培训费用可以全额扣除吗
  • 税控盘费用抵扣怎么申报什么表怎么说什么表怎么填报
  • 外贸企业怎么开出口发票
  • access数据类型是什么
  • win10预览版和正式版区别
  • win8开机启动项怎么关闭
  • CentOS 6.2(32位/64位) 安装步骤图文详解
  • gpt分区方法
  • win1020h2版本千万别更新
  • win7如何显示桌面
  • win8文件夹打不开
  • cocos creator打包
  • 2015.3.25--2.cocos精灵移动 动画控制(一)
  • texturepackergui
  • 快速掌握一个方法
  • 面试java基础知识
  • jquery.validator
  • 河北税务怎么查询交了没有
  • 图书销售税点
  • 土地增值税分期清算条件?
  • 海关行政处罚实施条例的适用范围
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设