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

  • 微信清除的图片怎么恢复(微信清除的图片怎么找回来)

    微信清除的图片怎么恢复(微信清除的图片怎么找回来)

  • 微信群如何修改自己的备注名称(微信群如何修改备注)

    微信群如何修改自己的备注名称(微信群如何修改备注)

  • 苹果13自带膜吗(iphone13自带手机膜吗)

    苹果13自带膜吗(iphone13自带手机膜吗)

  • 屏下指纹是哪家的技术(屏下指纹是哪个手机厂商发明的)

    屏下指纹是哪家的技术(屏下指纹是哪个手机厂商发明的)

  • 苹果11照相怎么美颜(苹果11照相怎么设置时间水印)

    苹果11照相怎么美颜(苹果11照相怎么设置时间水印)

  • 快手作者关闭下载权限怎么办(快手作者关闭下载权限,自己截图保存犯法吗)

    快手作者关闭下载权限怎么办(快手作者关闭下载权限,自己截图保存犯法吗)

  • oppo更新完系统怎么这么卡(oppo更新完系统蓝牙用不了)

    oppo更新完系统怎么这么卡(oppo更新完系统蓝牙用不了)

  • 拼多多实名认证安全吗(拼多多实名认证可以认证几个号)

    拼多多实名认证安全吗(拼多多实名认证可以认证几个号)

  • 双屏机是什么(双屏啥意思)

    双屏机是什么(双屏啥意思)

  • 抖音上面的视频都是用什么软件剪辑的(抖音上面的视频不想看的怎么让他不推送)

    抖音上面的视频都是用什么软件剪辑的(抖音上面的视频不想看的怎么让他不推送)

  • anc主动降噪什么意思(主动降噪anc enc)

    anc主动降噪什么意思(主动降噪anc enc)

  • 保存与另存为的区别(保存与另存为的区别和联系有哪些)

    保存与另存为的区别(保存与另存为的区别和联系有哪些)

  • 黑猫投诉怎样才能把帖子删除(黑猫投诉怎样才能完成)

    黑猫投诉怎样才能把帖子删除(黑猫投诉怎样才能完成)

  • 如何辨别cpu是否开过盖(如何辨别cpu是否坏了)

    如何辨别cpu是否开过盖(如何辨别cpu是否坏了)

  • findx2防水级别(oppo find x2防水吗)

    findx2防水级别(oppo find x2防水吗)

  • 主机电源400w和500w的区别(电源功率400w电脑主机)

    主机电源400w和500w的区别(电源功率400w电脑主机)

  • iphone11pro max配什么耳机(苹果11pro max应配对什么型号蓝牙耳机)

    iphone11pro max配什么耳机(苹果11pro max应配对什么型号蓝牙耳机)

  • 表格左上角的斜线怎么弄(表格左上角的斜线是什么意思)

    表格左上角的斜线怎么弄(表格左上角的斜线是什么意思)

  • ipad air2支持快充吗(ipad air2可以用快充头充电吗)

    ipad air2支持快充吗(ipad air2可以用快充头充电吗)

  • 苹果11的刘海怎么去掉(苹果11的刘海怎么拆下来)

    苹果11的刘海怎么去掉(苹果11的刘海怎么拆下来)

  • vivox9有没有nfc功能(vivox9s手机有没有nfc功能)

    vivox9有没有nfc功能(vivox9s手机有没有nfc功能)

  • 转转实名认证怎么解除(转转实名认证怎么改绑)

    转转实名认证怎么解除(转转实名认证怎么改绑)

  • 未保存的ppt怎么找(未保存的ppt去哪找)

    未保存的ppt怎么找(未保存的ppt去哪找)

  • 射频识别系统属于物联网的什么层

    射频识别系统属于物联网的什么层

  • 在word2010文档中编辑表格有哪些操作(在word2010文档中输入复杂的数学公式执行什么命令)

    在word2010文档中编辑表格有哪些操作(在word2010文档中输入复杂的数学公式执行什么命令)

  • ios12.2支持5g吗(ios12支持5g网络吗)

    ios12.2支持5g吗(ios12支持5g网络吗)

  • 手机出现新闻资讯怎么删除(手机出现新闻资讯界面退不出)

    手机出现新闻资讯怎么删除(手机出现新闻资讯界面退不出)

  • 来电声音太小怎么回事(来电声小了,如何调大声?)

    来电声音太小怎么回事(来电声小了,如何调大声?)

  • 小米volte在哪里设置(小米volte功能)

    小米volte在哪里设置(小米volte功能)

  • psimsvc.exe - psimsvc是什么进程 有什么用

    psimsvc.exe - psimsvc是什么进程 有什么用

  • 大盛房地产中介公司
  • 上缴非税收入前是否要交税
  • 社保是当月计提当月的吗
  • 取得社会团体会费专用票据可以税前扣除吗
  • 固定资产未入固定资产账
  • 转业士官自谋职业
  • 软件开发过程的一般步骤
  • 资金周转率计算公式期初占用资金
  • 增值税税控设备服务费
  • 计算完工产品成本和月末在产品成本
  • 库存商品盘盈盘亏表
  • 退税入其他收益需要再缴税吗
  • 员工个人所得税申报方式选哪个
  • 现金比率在多少比较合适
  • 固定资产抵扣的税率
  • 与工程有关的差旅费是否可以计入在建工程呢?
  • 印花税计税金额是含税还是不含税
  • 增值税申报错误已经扣税怎么处理
  • 外资企业税率是多少
  • 房产税存在往期未申报信息怎么处理
  • 家里的无线网连着连着就断了
  • 双链表的删除操作算法,两条改链语句能调换位置吗?
  • 直系亲属股权转让免征个人所得税
  • php ftp功能
  • yii2框架运行原理
  • 劳务派遣发票会扣税吗
  • 银行贷款成本高
  • 代境外汇款收的什么费用
  • 总部资产减值测试例题
  • 采用公允价值模式计量的投资性房地产处置
  • 未取得专用发票详细原因怎么写
  • 关于php文件的自动播放
  • php图片代码
  • 会计等式反映了六大会计要素的恒等关系
  • Vue3通透教程【十二】TS类型声明优势
  • 私人打款到对公账户要交税吗
  • 企业初期面临的主要问题
  • 发票跨月发现开错该怎么办?
  • 进项税忘了加计怎么处理
  • 新租赁准则下的会计分录
  • 列入固定资产的金额标准
  • sqlserver存储过程声明变量
  • 织梦使用手册
  • 财务人员如何做一个合格的党员
  • 在建工程盘盈盘亏的账务处理
  • 怎么查询mysql sql_mode
  • 购入固定资产入账会计凭证怎么做
  • 固定资产清理损益表怎么填
  • 收到采购发票如何录入系统
  • 顾问费交多少税
  • 广告牌制作计入什么科目
  • 销售折扣怎么制定
  • 09年前的固定资产
  • 管家婆进货单怎么录入?
  • 普通发票和增值税发票的区别图片
  • 小规模纳税人发票可以抵扣吗
  • win10自带的音乐播放器groove如何设置
  • macbook appstore在哪
  • java开发经常出差合理吗
  • 苹果系统如何访问u盘
  • 并发控制三个问题
  • 两台mac怎么同步
  • windows unistd.h
  • win8对机械硬盘不友好
  • win7小技巧
  • 进windows花屏
  • window10自动维护功能有什么用
  • javascript例题
  • python选择器
  • [置顶]马粥街残酷史
  • js点击div改变css样式
  • javascript()
  • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例
  • Jquery实现select multiple左右添加和删除功能的简单实例
  • 安卓中px,dp,sp的区别
  • 如何加强部门联动协作
  • 税务系统跨区调动
  • 深圳国税电子税务局网上办税服务厅
  • 税务稽查工作底稿属于什么证据
  • 补充耕地指标费用能从储备中心支付吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设