位置: IT常识 - 正文

Scala-泛型(scala实例)

发布时间:2024-01-27
泛型 泛型定义 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函数介绍)

  • 审计合同需要交税吗
  • 广告行业的税负率
  • 个人所得税是什么
  • 增值税专用发票丢失了要怎么处理
  • 员工外出办事报备制度
  • 社保的滞纳金放什么科目
  • 收到单位借款如何处理
  • 员工买东西自己垫付的钱怎么做账
  • 视同销售填在申报表哪一栏
  • 一般纳税人的税务筹划
  • 更换电脑后个税信息如何导入
  • 养老机构提供的养老服务免增值税吗
  • 企业注销的时候未分配利润怎么处理
  • 固定资产的净收益和净损失怎么计算
  • 合同违约金账务处理
  • 以旧换新会计处理金银首饰
  • 事业单位收个人部分社保怎么入账
  • 装修职工宿舍用的瓷砖,灯具等计入什么科目?
  • 存货盘盈与盘亏
  • 预收物业费是否必须开具发票
  • 非独立核算分公司怎么报税
  • 启用新账簿
  • 企业自建房是什么意思
  • 怎么辨认专用发票真伪
  • 车辆保险属于金融机构吗
  • 中标服务费会计科目
  • 工伤后辞职了还可以报工伤
  • 转籍车辆是什么意思
  • 公立医院规章制度
  • 进项税额转出的
  • 管理费用明细是什么意思
  • 两万元大写金额报销单怎么写
  • 自建自用建筑物,其自建行为不是建筑业税目的征税范围
  • 公司如何为员工缴纳社保
  • 软件开发过程中必须伴有质量保证活动
  • 非金融类企业的货币资金主要包括哪些内容?
  • 临时文件夹移动到c盘根目录下windows7
  • 企业免征增值税证明怎么打印
  • 研发费用加计扣除
  • php数组函数面试题
  • 慈善总会捐赠流程
  • PHP:Memcached::getServerByKey()的用法_Memcached类
  • nmstt.exe - nmstt是什么进程 有什么用
  • 预提费用新会计准则叫什么科目
  • 工资储备金制度
  • 申请专利费用计入哪个科目
  • 基金管理人应当自与基金销售机构签订销售协议之日起
  • 公司购买银行理财会计分录
  • 财政拨入的科技费是什么
  • 固定资产一次性折旧账务处理
  • 如何做进项税额转出处理
  • ps抠图怎样
  • 织梦下载站源码带采集
  • SQLite教程(三):数据表和视图简介
  • 购买图书的会计账务处理
  • 自然人独资公司可以变更法人吗
  • MySQL Replace INTO的使用
  • sqlserver经典书籍
  • 购买加油卡走哪个平台好
  • 税后利润分配还要交税
  • 工会经费怎么计提及使用
  • 个体工商户员工如何报生育险
  • 进项不能从销项抵扣
  • 冲红专票分录
  • 分红冲抵往来会计分录
  • 支付水电费取得专用发票上注明税金0.68万元
  • 系统多交税款放在哪里
  • 出售房产收入属于转让财产收入吗
  • 系统存储过程以什么为前缀
  • MySql 5.6.14 Win32位免安装解压缩版配置教程
  • centos编译器
  • vistasp3
  • bios里怎么找不到usb启动
  • linux如何调出鼠标
  • 隐藏网络怎么连接电脑连不上
  • android 生成图片
  • php操作dom
  • 编写高质量代码改善JAVA程序的151个建议
  • python做开发
  • 税务ukey版商品编码怎么添加
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号