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

  • 苹果手机镜面翻转在哪设置(苹果手机镜面翻转在哪里)

    苹果手机镜面翻转在哪设置(苹果手机镜面翻转在哪里)

  • 小红书有电脑版吗(小红书有电脑版或网页版吗)

    小红书有电脑版吗(小红书有电脑版或网页版吗)

  • 手机信息字体变大怎么调整(手机信息字体变大了怎么调回去)

    手机信息字体变大怎么调整(手机信息字体变大了怎么调回去)

  • 手机上做表格如何操作(手机上做表格如何换图片)

    手机上做表格如何操作(手机上做表格如何换图片)

  • 如何把表格中的线去掉(如何把表格中的字体上下居中)

    如何把表格中的线去掉(如何把表格中的字体上下居中)

  • 苹果几是双卡双待(苹果几是双卡双待5G)

    苹果几是双卡双待(苹果几是双卡双待5G)

  • 电脑小写英文字母按哪个键(电脑小写英文字母并大写按哪个指标)

    电脑小写英文字母按哪个键(电脑小写英文字母并大写按哪个指标)

  • 朋友的新动态有访问记录吗(朋友新动态是怎么回事)

    朋友的新动态有访问记录吗(朋友新动态是怎么回事)

  • 耳机续航是什么意思(耳机续航时间是什么意思?)

    耳机续航是什么意思(耳机续航时间是什么意思?)

  • 淘宝评价管理已处理评价是什么意思(淘宝评价管理已处理的评价怎么回事)

    淘宝评价管理已处理评价是什么意思(淘宝评价管理已处理的评价怎么回事)

  • 手机上可以下载电脑系统吗(手机上可以下载歌曲到u盘吗)

    手机上可以下载电脑系统吗(手机上可以下载歌曲到u盘吗)

  • 为什么3dmax安装不了(为什么3dmax安装在固态硬盘,消耗c盘的内存)

    为什么3dmax安装不了(为什么3dmax安装在固态硬盘,消耗c盘的内存)

  • wps会员拥有多大的云文档存储空间(wps会员拥有多大的云文档)

    wps会员拥有多大的云文档存储空间(wps会员拥有多大的云文档)

  • 快手怎么只直播音乐不露面(快手怎么只直播游戏画面)

    快手怎么只直播音乐不露面(快手怎么只直播游戏画面)

  • 为什么交了话费手机还是没网络(为什么交了话费宽带还是不能用)

    为什么交了话费手机还是没网络(为什么交了话费宽带还是不能用)

  • 定时说说在哪里查看(定时说说在哪里编辑)

    定时说说在哪里查看(定时说说在哪里编辑)

  • iPad?Air2与iPad?mini3有什么区别(ipadair2与ipadmini5哪个好)

    iPad?Air2与iPad?mini3有什么区别(ipadair2与ipadmini5哪个好)

  • 1.5伏aa是几号电池(1.5a是多少伏)

    1.5伏aa是几号电池(1.5a是多少伏)

  • 台式电脑卡换什么硬件(台式电脑卡换什么配件就行了)

    台式电脑卡换什么硬件(台式电脑卡换什么配件就行了)

  • 抖音投放6小时12小时的区别(抖音投放6小时和24小时效果一样吗)

    抖音投放6小时12小时的区别(抖音投放6小时和24小时效果一样吗)

  • 华为pro30可以放几张卡(华为pro30可以用几张卡)

    华为pro30可以放几张卡(华为pro30可以用几张卡)

  • vivo手机不会自动锁屏(vivo手机不会自动更新软件)

    vivo手机不会自动锁屏(vivo手机不会自动更新软件)

  • 如何通过抖音号查找微信(如何通过抖音号找到这个人)

    如何通过抖音号查找微信(如何通过抖音号找到这个人)

  • 手机扩容是什么意思(手机扩容是什么意思 手机扩容相关知识介绍)

    手机扩容是什么意思(手机扩容是什么意思 手机扩容相关知识介绍)

  • 手机网络限速怎么解除(手机网络限速怎么办)

    手机网络限速怎么解除(手机网络限速怎么办)

  • 小红书如何申请会员(小红书如何申请视频号)

    小红书如何申请会员(小红书如何申请视频号)

  • 八仙花的养殖方法(八仙花的养殖方法冬季怎么养)

    八仙花的养殖方法(八仙花的养殖方法冬季怎么养)

  • 小规模免增值税是普票还是专票
  • 视同销售行为涉税处理?
  • 代付的费用收不收手续费
  • 开农贸市场挣钱吗
  • 酒店物业费收取标准2019
  • 衍生金融负债是金融负债吗
  • 施工劳务企业要交增值税吗
  • 工会经费计入成本费用
  • 材料采购合同需要注意什么
  • 汽车年审属于什么费用
  • 公司 捐赠
  • 个体户查账征收怎么交税?
  • 纳税调整的情况
  • 投资收益率如何确定
  • 财税2018 39号文件
  • 公司主要业务介绍
  • 现金支票怎么背书转让
  • 购进货物运费会退吗
  • 商铺买过来需要交税吗
  • 路由器管家怎么登录
  • 用友软件查其他业务收入怎么查
  • 房地产企业能申请破产吗
  • linux shell 比较运算符
  • 公司已开工程发票怎么开
  • PHP:base64_encode()的用法_url函数
  • php数组函数大全
  • 开发间接费用会计分录
  • thinkphp5.1完全开发手册
  • 收到无法支付的押金收入
  • 销售金额较大多少算较大
  • 存货捐赠视同销售要不要确认收入?
  • pytorch中的数据类型
  • 蓝色向日葵
  • 开源ei
  • 一张专票可以开几项
  • 小微公司开票
  • php防盗链
  • 农机融资租赁公司联系方式
  • 购入固定资产入账成本
  • 小微企业直接考察模式
  • mysql proxy问题的解决方法
  • 企业筹建期间的费用处理
  • 实际已缴纳所得税额大于初始化金额
  • 息税前利润变动率怎么算
  • 工伤陪护费计入哪个科目
  • 提取法定盈余公积会计分录
  • 金税三期升级功能2020
  • 现金日记账的结账方法
  • 购买税控盘的费用怎么抵减
  • 企业与股东之间的关系,也是企业与投资者之间的关系
  • 政府补贴的装修费是免税的吗
  • 公司股东可以买公司股票吗
  • 编制现金流量表应以什么为基础
  • 小规模纳税人销售自己使用过固定资产
  • 小规模纳税人开的专票对方可以抵扣吗
  • 甲方代付农民工工资谁报个税
  • 法人在公司账户取钱要纳税么
  • 营业外收入是否影响营业利润
  • 外派员工的薪酬构成有哪些项目
  • 净利润和毛利润的区别公式
  • sql 建索引
  • mysql 5.7.5 m15 winx64.zip安装教程
  • 彻底清除硬盘中的文件
  • linux中awk怎么用
  • windows安装软件需要管理员权限
  • win7内存检测工具
  • 如何调整输入法框的大小
  • win8系统连接共享打印机需要设置什么
  • document.location.hash
  • 使用css实现全兼容的方法
  • cocos creator rpg
  • 创建nodejs项目的步骤
  • python简明
  • javascript总结笔记
  • python xml.etree.ElementTree遍历xml所有节点实例详解
  • qt Android开发
  • 科级干部试用期一年转正流程
  • 掌上海关怎么查询
  • 九江税务总局
  • 国税总局17号公告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设