泛型

  • 泛型类
 1 package day0603
2
3 class GenericClassInt {
4 private var content:Int=10
5 def set(value:Int)={content=value}
6 def get():Int={content}
7 }
8
9 class GenericClassString {
10 private var content:String=""
11 def set(value:String)={content=value}
12 def get():String={content}
13 }
14
15 class GenericClass[T]{
16 private var content:T = _
17 def set(value:T) = {content=value}
18 def get():T={content}
19 }
20
21 object GenericClass{
22 def main(args: Array[String]):Unit = {
23 var v1 = new GenericClass[Int]
24 v1.set(1000)
25 v1.get()
26
27 var v2 = new GenericClass[String]
28 v2.set("Hello")
29 v2.get()
30 }
31 }
  • 泛型函数

    • ClassTag表示Scala在运行时的状态信息,这里表示调用时的数据类型

  • 上界和下界

    • 规定泛型的取值范围
    • 上界:S <:  T 规定了S的类型必须是T的子类或者本身
    • 下界:U >:  T 规定了U的类型必须是T的父类或者本身
 1 package day0603
2
3 class Vehicle{
4 def drive()={println("Driving")}
5 }
6
7 class Car extends Vehicle{
8 override def drive()={println("Car Driving")}
9 }
10
11 class Bike extends Vehicle{
12 override def drive()={println("Bike Driving")}
13 }
14
15 object ScalaUpperBound {
16 def takeVehicle[T <: Vehicle](v:T)={v.drive()}
17 def main(args: Array[String]):Unit = {
18
19 var v:Vehicle = new Vehicle
20 takeVehicle(v)
21
22 var c:Vehicle = new Car
23 takeVehicle(c)
24
25 //不能传递别的类型
26 //takeVehicle("Hello")
27 }
28 }

  • 视图界定(View Bound)

    • 除了可以接收上界和下界规定的类型以外,还可以接收能够通过隐式转换过去的其他类型,用 % 表示
    • 首先调用int2String,把Int转为String,再调用addTwoString

  • 协变和逆变

    • 协变:在类型参数的前面加 +,泛型变量的值可以是本身类型或其子类类型
 1 package day0603.demo1
2
3 class Animal
4
5 class Bird extends Animal
6 class Sparrow extends Bird
7
8 class EatSomething[+T](t:T)
9
10 object DemoClass1 {
11 def main(args: Array[String]):Unit = {
12 var c1:EatSomething[Bird] = new EatSomething[Bird](new Bird)
13 //尽管Bird是Animal的这子类,但EatSometing[Bird]不是EatSometing[Animal]的子类
14 var c2:EatSomething[Animal] = c1
15
16 var c3:EatSomething[Sparrow]=new EatSomething[Sparrow](new Sparrow)
17 var c4:EatSomething[Animal]=c3
18 }
19 }
    • 逆变:在类型参数的前面加 -,泛型变量的值可以是本身类型或其父类类型
 1 package day0603.demo2
2
3 class Animal
4
5 class Bird extends Animal
6 class Sparrow extends Bird
7
8 class EatSomething[-T](t:T)
9
10 object Demo2Class {
11 def main(args: Array[String]):Unit = {
12 var c1:EatSomething[Bird] = new EatSomething[Bird](new Bird)
13 //var c2:EatSomething[Sparrow] = new EatSomething[Sparrow](new Sparrow)
14 //尽管Bird是Sparrow的父类,但EatSometing[Bird]不是EatSometing[Sparrow]的父类
15 var c2:EatSomething[Sparrow] = c1
16 }
17 }

隐式转换

  • 隐式转换函数

    • 多了一个关键字implicit
    • 定义后,不需要显示调用,编译器会自动调用
 1 package day0603
2
3 class Fruit(name:String){
4 def getFruitName():String=name
5 }
6
7 class Monkey(f:Fruit){
8 def say()={println("Monkey like "+f.getFruitName())}
9 }
10
11 object ImplicitDemo {
12
13 implicit def fruit2Monkey(f:Fruit):Monkey = {new Monkey(f)}
14
15 def main(args: Array[String]):Unit = {
16 var f:Fruit = new Fruit("Banana")
17
18 //把Fruit转成Monkey就可调用say()
19 f.say()
20 }
21 }

Monkey like Banana

  • 隐式参数

    • 调用时没有给函数传递参数值,采用隐式参数

  • 隐式类

    • 可增强类的功能
 1 object ImplicitClassDemo {
2 //定义隐式类,增强对象功能
3 implicit class Calc(x:Int){
4 def add(y:Int):Int = x+y
5 }
6
7 def main(args: Array[String]):Unit = {
8 println("两个数字的和是: " + 1.add(2)) // 没有add方法
9 }
10 }

两个数字的和是: 3

[Scala] 高级特性的更多相关文章

  1. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  2. scala高级特性-01

    目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...

  3. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  4. 大数据笔记(二十六)——Scala语言的高级特性

    ===================== Scala语言的高级特性 ========================一.Scala的集合 1.可变集合mutable 不可变集合immutable / ...

  5. Spark Streaming高级特性在NDCG计算实践

    从storm到spark streaming,再到flink,流式计算得到长足发展, 依托于spark平台的spark streaming走出了一条自己的路,其借鉴了spark批处理架构,通过批处理方 ...

  6. scala高级性质-隐式转换 -02

    今天我们来介绍scala的高级特性,上次已经介绍过他的一个特性:高阶函数,这次是隐式转换 1.隐式转换的例子 read的例子 解析:发现这个file没有read的方法,然后就开始在开始在这个上下文里面 ...

  7. ActiveMQ中的Destination高级特性(一)

    ---------------------------------------------------------------------------------------- Destination ...

  8. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  9. 云端卫士实战录 | Java高级特性之多线程

    <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

随机推荐

  1. 什么是事务?事务的四个特性(ACID)?并发事务带来哪些问题?事务隔离级别都有哪些?事务的传播特性

    什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事物的四个 ...

  2. 从wav到Ogg Opus 以及使用java解码OPUS

    PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码.PCM通过抽样.量化.编码三个步骤将连续变化的模拟信号转换为数字编码. 采样率 采样频率,也称为采样速度或 ...

  3. KubeEdge EdgeMesh设计原理

    EdgeMesh主要用来做边缘侧微服务的互访. ServiceMesh service mesh是一个服务网格的概念.在传统的架构里面都是通过像Dubbo来进行服务治理,服务治理的程序和我们应用程序强 ...

  4. 如何使用yolov3训练自己的数据集

    博客主要结构 1. 如何在ubuntu18.04上安装yolo 2 .如何配置yolov3 3 .如何制作自己的训练集测试集 4 .如何在自己的数据集上运行yolov3 1. 在ubuntu18.04 ...

  5. Java(279-298)【异常、线程】

    1.异常的概念&异常的体系 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将 受影响.在程序中的意思就是: 异常 :指的是程序在执行过 ...

  6. 【CTF】WDCTF-2017 3-1 writeup

    题目来源:WDCTF-2017 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1& ...

  7. Day13_72_类锁

    类锁 * 对象锁(synchronized method{})和类锁(static sychronized method{})的区别 - 对象锁也叫实例锁,对应synchronized关键字,当多个线 ...

  8. k8s 使用nfs做provisioner

    官方的nfs provisoner,serviceAccount RABC相关 请在这里下载https://raw.githubusercontent.com/kubernetes-incubator ...

  9. xPath,beautifulsoup和pyquery

    一.XPath from lxml import etree html = etree.parse('html源代码',etree.HTMLPaser()) 1.节点的获取 a.html.xpath( ...

  10. MyBatisPlus入门学习

    目录 MyBatisPlus 概述 快速入门 配置日志输出 CRUD拓展 插入 主键生成策略 更新操作 自动填充 乐观锁 查询操作 分页查询 删除操作 逻辑删除 性能分析插件 条件构造器 代码自动生成 ...