位置: 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函数介绍)

  • vivox70来电闪光灯在哪里(vivox7来电闪光灯)

    vivox70来电闪光灯在哪里(vivox7来电闪光灯)

  • excel怎么按自己的规律递增(excel怎么按自己想要的顺序排序)

    excel怎么按自己的规律递增(excel怎么按自己想要的顺序排序)

  • mac关不了电脑(mac电脑关不了怎么办)

    mac关不了电脑(mac电脑关不了怎么办)

  • xsmaxwifi信号不稳定(苹果xsmaxwifi信号弱是什么原因)

    xsmaxwifi信号不稳定(苹果xsmaxwifi信号弱是什么原因)

  • 华为手机怎么找最近删除的照片(华为手机怎么找回)

    华为手机怎么找最近删除的照片(华为手机怎么找回)

  • qq默契问答是自动邀请吗(qq默契问答是自己问吗)

    qq默契问答是自动邀请吗(qq默契问答是自己问吗)

  • 苹果se充电时间多久(苹果se1充电时间)

    苹果se充电时间多久(苹果se1充电时间)

  • 苹果se电池不耐用(苹果手机se2电池不耐用)

    苹果se电池不耐用(苹果手机se2电池不耐用)

  • 淘宝有英文版的吗(有英文版的淘宝吗)

    淘宝有英文版的吗(有英文版的淘宝吗)

  • 笔记本无线网络连接不上(笔记本无线网络红叉怎么修复)

    笔记本无线网络连接不上(笔记本无线网络红叉怎么修复)

  • 电池胶拉断了怎么办(电池胶拉断了怎么办视频)

    电池胶拉断了怎么办(电池胶拉断了怎么办视频)

  • 苹果快充支持哪些手机(苹果快充支持哪个品牌)

    苹果快充支持哪些手机(苹果快充支持哪个品牌)

  • 新买的苹果11自带钢化膜吗(新买的苹果11自动关机)

    新买的苹果11自带钢化膜吗(新买的苹果11自动关机)

  • ipad连接不了音箱(为什么ipad连不上音响)

    ipad连接不了音箱(为什么ipad连不上音响)

  • a1489是mini几(a1490是mini几代是4g吗)

    a1489是mini几(a1490是mini几代是4g吗)

  • 滴滴优享申请条件(滴滴优享申请条件需要多少单量)

    滴滴优享申请条件(滴滴优享申请条件需要多少单量)

  • cpu长期100度会烧吗(cpu长期100度会烧坏吗)

    cpu长期100度会烧吗(cpu长期100度会烧坏吗)

  • 佳能相机怎么调快门速度(佳能相机怎么调参数设置)

    佳能相机怎么调快门速度(佳能相机怎么调参数设置)

  • xsmax来电不显示名字(xsmax来电不显示归属地)

    xsmax来电不显示名字(xsmax来电不显示归属地)

  • 华为推送服务怎么取消(华为推送服务怎么打开)

    华为推送服务怎么取消(华为推送服务怎么打开)

  • 华为mate30是5g还是4g(华为mate30属于5g手机吗)

    华为mate30是5g还是4g(华为mate30属于5g手机吗)

  • 华为p30mate30区别(华为p30与mate30区别)

    华为p30mate30区别(华为p30与mate30区别)

  • 华为p30有哪些特殊功能(华为p30有哪些特点和功能)

    华为p30有哪些特殊功能(华为p30有哪些特点和功能)

  • 淘宝异地发货会处理吗(淘宝卖家异地发货违规吗)

    淘宝异地发货会处理吗(淘宝卖家异地发货违规吗)

  • ar和vr的区别和用途(ar和vr的区别和用途工地)

    ar和vr的区别和用途(ar和vr的区别和用途工地)

  • 小米9手机怎么放卡(小米9手机怎么拆开后盖视频)

    小米9手机怎么放卡(小米9手机怎么拆开后盖视频)

  • oppor17r15x区别(oppor17和oppor15x哪个好)

    oppor17r15x区别(oppor17和oppor15x哪个好)

  • 对方公司为什么一定要专票
  • 股权转让企业所得税纳税地点
  • 汇算清缴需要传什么资料
  • 个体户查账征收怎么交税?
  • 职工食堂费用计入管理费用
  • 小规模纳税人税额怎么做分录
  • 全年没有超过起征点需要汇算吗
  • 服务费发票税率1%
  • 发票勾选比账上多
  • 发票备注没写
  • 个人所得税生产经营所得税率
  • 集体企业弊端
  • 零售盘点窍门
  • 科技成果转化奖励
  • 外地报销怎么报
  • 公司组织客户旅游费用怎么做账
  • 代扣代缴增值税是什么意思
  • 税收滞纳金算不算所得税
  • 小型微利企业所得税优惠政策
  • 已抵扣发票红冲后发票还给对方公司
  • 旅行社差额纳税发票怎么开具
  • 外购物品用于计提折旧吗
  • 向职工出售住房
  • 递延所得税资产借贷方向
  • 会计事务所成本核算方法
  • 组织员工出游注意事项
  • 卸载软件怎么清理干净
  • 如何升级mac系统到10.12
  • 让记事本文件自动删除
  • reminder.exe - reminder是什么进程 有什么用
  • 有什么好方法可以让小孩子少吃糖
  • win11安装不显示wifi
  • 营改增后工程税收怎么计算
  • php 读取文本文件
  • 贸易型企业能开什么增值税票
  • 会计政策变更累计数
  • 土地款什么时候进在建工程
  • wordpress静态分离
  • 持有至到期投资是什么意思
  • 完整财务报表包括哪几类
  • 一个月可以勾选多少进项税额
  • 白酒贴牌酒是真酒还是假酒
  • 印花税最新的征收方法
  • 生活办公用品清单
  • 织梦如何采集文章
  • 大额医疗保险计入什么科目
  • 同时运行多个MySQL服务器的方法
  • 代缴职工社保是啥意思
  • 生产成本如何结转
  • 公司收到虚开发票
  • 行政单位基建账地质灾害评估报告计哪个科目
  • 广告设计合同属于什么合同
  • 建筑企业收到材料发票没有备注工程地址可以用吗
  • 三年期定期存款利率怎么算
  • 集团公司向下属发评先奖金合法吗
  • 股东之间股权转让的税务处理
  • 无发票临时工劳务费账务处理
  • 年报和汇算清缴的顺序
  • 建筑企业其他应付款包含什么内容
  • 财务负责人和办税员可以是一个吗
  • 红冲发票金额大于原发票金额
  • 备查账簿的格式和登记方法
  • 通过sql存储过程发送邮件的方法
  • dell bios密码忘记
  • iis怎么用
  • win8如何安装win10系统
  • win10使用技巧有什么用
  • mac如何访问win10文件
  • centos6 systemctl
  • Ubuntu After Install 2.6 帮助你安装 Ubuntu 常用软件
  • mac怎么设置屏幕显示时间
  • 电脑硬盘磁盘是什么材料
  • win8系统如何恢复出厂设置
  • 苹果电脑Mac系统版本所对应的数字
  • KbdTray.exe - KbdTray是什么进程 有什么作用
  • windows8介绍
  • opengl教程48讲
  • perl -p -i
  • 解决js请求服务问题
  • python gensim
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设