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

  • 淘宝SEO的三大策略(淘宝seo的三大策略是)

    淘宝SEO的三大策略(淘宝seo的三大策略是)

  • vivoy31s和y52s手机壳通用吗(vivoy31s和y52s手机膜一样吗)

    vivoy31s和y52s手机壳通用吗(vivoy31s和y52s手机膜一样吗)

  • 小米mix3录屏在哪里打开(小米mix3录屏不见了)

    小米mix3录屏在哪里打开(小米mix3录屏不见了)

  • 苹果删除软件怎么才能彻底删除(苹果删除软件怎么找回来)

    苹果删除软件怎么才能彻底删除(苹果删除软件怎么找回来)

  • 是不是把对方的微信删了就没有聊天记录了(是不是把对方的微信拉黑)

    是不是把对方的微信删了就没有聊天记录了(是不是把对方的微信拉黑)

  • 海康威视摄像头重置(海康威视摄像头密码忘记了怎么办)

    海康威视摄像头重置(海康威视摄像头密码忘记了怎么办)

  • vivox27备忘录怎么变成黑色(vivi的备忘录在哪)

    vivox27备忘录怎么变成黑色(vivi的备忘录在哪)

  • Word为怎么在页脚里加一条直线(word文档怎么在一页里显示)

    Word为怎么在页脚里加一条直线(word文档怎么在一页里显示)

  • 手机充电器是多少v(手机充电器是多少瓦的功率)

    手机充电器是多少v(手机充电器是多少瓦的功率)

  • 华为nova3i和nova3区别(华为nova3i和nova3有什么区别)

    华为nova3i和nova3区别(华为nova3i和nova3有什么区别)

  • 摄像头亮蓝色是啥意思(摄像头显示蓝色)

    摄像头亮蓝色是啥意思(摄像头显示蓝色)

  • 怎么投诉卖家48小时未发货(怎么投诉卖家虚假发货)

    怎么投诉卖家48小时未发货(怎么投诉卖家虚假发货)

  • 电脑键盘光怎么开启(电脑键盘光怎么改颜色)

    电脑键盘光怎么开启(电脑键盘光怎么改颜色)

  • 苹果手机怎么关闭静音(苹果手机怎么关闭境外来电)

    苹果手机怎么关闭静音(苹果手机怎么关闭境外来电)

  • word内框线怎么设置颜色(word内框线怎么变颜色)

    word内框线怎么设置颜色(word内框线怎么变颜色)

  • 京东上确认收货啥意思(京东上确认收货后怎么补差价)

    京东上确认收货啥意思(京东上确认收货后怎么补差价)

  • Watch GT2怎么设置锁定(watch gt2怎么设置自己的图片)

    Watch GT2怎么设置锁定(watch gt2怎么设置自己的图片)

  • 电话已关机是拉黑了吗(电话已关机是没电了吗)

    电话已关机是拉黑了吗(电话已关机是没电了吗)

  • 苹果xr无线充电多少w(苹果xr无线充电怎么设置)

    苹果xr无线充电多少w(苹果xr无线充电怎么设置)

  • 三星tf卡红卡和橙卡的区别是什么(三星tf卡红卡和橙卡哪个好)

    三星tf卡红卡和橙卡的区别是什么(三星tf卡红卡和橙卡哪个好)

  • 华为p30pro支持外置卡吗(华为p30pro支持外置内存卡吗)

    华为p30pro支持外置卡吗(华为p30pro支持外置内存卡吗)

  • 抖音商品橱窗收费吗(抖音商品橱窗收款账号必须是个人的吗?)

    抖音商品橱窗收费吗(抖音商品橱窗收款账号必须是个人的吗?)

  • switch续航版和普通版区别

    switch续航版和普通版区别

  • 微店二维码在哪里找(微店的二维码在哪)

    微店二维码在哪里找(微店的二维码在哪)

  • 华为手机备份在哪里找(华为手机备份在哪里打开)

    华为手机备份在哪里找(华为手机备份在哪里打开)

  • matlab中hold on是什么意思(matlab中 hold on 与hold off的用法)

    matlab中hold on是什么意思(matlab中 hold on 与hold off的用法)

  • 苹果版本怎么看国家(苹果手机怎么更新最新版本)

    苹果版本怎么看国家(苹果手机怎么更新最新版本)

  • 小米8数据线接口类型(小米数据线接口叫什么)

    小米8数据线接口类型(小米数据线接口叫什么)

  • Win11应用商店连不上网怎么办?Win11应用商店无法联网的解决方法(win11 应用商店)

    Win11应用商店连不上网怎么办?Win11应用商店无法联网的解决方法(win11 应用商店)

  • 管理费用与税金及附加哪个会影响利润
  • 贷款其他消费是指什么
  • 企业所得税年报怎么查询
  • 减值准备为什么影响利润总额
  • 查账征收企业所得税年报怎么填
  • 无形资产摊销年限
  • 预算分配比例与国库不一样
  • 个体工商户注销后的责任承担问题
  • 应收账款项目分析思维导图
  • 应收利息对应什么科目
  • 新企业所得税法规定的企业所得税基本税率
  • 建筑企业预收款开票
  • 车间设备维修费计入制造费用吗
  • 仓库货物破损处理方法
  • 融资租赁中承租人的权利
  • 外出经营活动税收管理证明和跨区域涉税事项报告表
  • 工会没有税号怎么开普票
  • 企业并购重组有哪些
  • 管理不善存货损失 企业所得税
  • 金融服务利息税率是多少
  • 年底结账时需要做账吗
  • 应付职工薪酬借方负数是什么意思
  • win10专业版技巧
  • 实收资本要求
  • 计提本月短期借款利息1000元
  • 购买电子承兑差额怎么算
  • mt-mon.exe
  • 期间费用属于间接生产费用吗
  • 营改增后哪些费用可以抵扣
  • php数组函数题目
  • 公司向股东个人借款最新规定
  • 小规模纳税人购车是怎么抵税的
  • 微软商店 低价区
  • 集群怎么写
  • yii框架教程
  • symfony框架经验总结
  • 工业企业成本怎么结转
  • 建行E信通贴现需要什么资料
  • SwinIR实战:详细记录SwinIR的训练过程
  • ngnix 命令
  • php计时函数
  • 无偿划转资产涉及产权转移应交税
  • 出售子公司股权不丧失控制权
  • 织梦使用教程
  • 织梦cms要钱吗
  • 进项发票抵扣税率
  • 企业分配股权
  • 车改补贴算工资吗
  • datatable怎么用
  • 改良生产线发生的职工薪酬计入期间费用
  • 其他应收款账户管理应遵循
  • 记账凭证如何进行记账
  • 应交增值税减免税款是什么意思
  • 企业股权融资方式有哪些
  • 事业单位的股东是谁
  • 企业亏损净资产降低吗
  • 未分配利润高怎么解释
  • 新手公司内帐怎么做
  • 工业企业如何建立税务风险预警体系工作表
  • 微软windows8.1
  • Mac如何使用clash上外网
  • docker1.12.6
  • win10的svchost干什么的
  • linux查看磁盘挂载的命令
  • quicktimeplayer.exe - quicktimeplayer是什么进程 有什么用
  • 根据显示的图的照片吊坠
  • windows10不能在任务栏进行的操作
  • win10无法安装无线显示器
  • Android Chronometer(定时器)
  • javascript中的函数也称为什么
  • 各种扩展名的含义
  • javascript的相关应用
  • NGUI简介
  • python的设置
  • jquery倒计时代码
  • node.js + socket.io 实现点对点随机匹配聊天
  • python的了解
  • 2021税务公告
  • 银行服务创新金点子
  • 美国网购消费者个人信息保护法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设