[Scala] 高级特性
泛型
- 泛型类
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] 高级特性的更多相关文章
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- scala高级特性-01
目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- 大数据笔记(二十六)——Scala语言的高级特性
===================== Scala语言的高级特性 ========================一.Scala的集合 1.可变集合mutable 不可变集合immutable / ...
- Spark Streaming高级特性在NDCG计算实践
从storm到spark streaming,再到flink,流式计算得到长足发展, 依托于spark平台的spark streaming走出了一条自己的路,其借鉴了spark批处理架构,通过批处理方 ...
- scala高级性质-隐式转换 -02
今天我们来介绍scala的高级特性,上次已经介绍过他的一个特性:高阶函数,这次是隐式转换 1.隐式转换的例子 read的例子 解析:发现这个file没有read的方法,然后就开始在开始在这个上下文里面 ...
- ActiveMQ中的Destination高级特性(一)
---------------------------------------------------------------------------------------- Destination ...
- Python3学习(二)-递归函数、高级特性、切片
##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
随机推荐
- PAT (Advanced Level) Practice 1015 Reversible Primes (20 分) 凌宸1642
PAT (Advanced Level) Practice 1015 Reversible Primes (20 分) 凌宸1642 题目描述: A reversible prime in any n ...
- [图论]剑鱼行动:prim
剑鱼行动 目录 剑鱼行动 Description Input Output Sample Input Sample Output 解析 难点 代码 Description 给出N个点的坐标,对它们建立 ...
- 第一个真正的 GUI 程序——Tkinter教程系列02
第一个真正的 GUI 程序--Tkinter教程系列02 前言 欢迎光临我的个人博客 chens.life Tk 系列教程: Tkinter教程系列01--引言和安装Tk 我们将编写一个英尺和米的转换 ...
- Java中对象的生与灭- 核心篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中对象的生与灭- 核心篇>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻烦在评论区回复或后台私信,谢啦 简介 ...
- [源码解析] 并行分布式任务队列 Celery 之 多进程模型
[源码解析] 并行分布式任务队列 Celery 之 多进程模型 目录 [源码解析] 并行分布式任务队列 Celery 之 多进程模型 0x00 摘要 0x01 Consumer 组件 Pool boo ...
- Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd
前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...
- 【CTF】WDCTF-2017 3-1 writeup
题目来源:WDCTF-2017 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1& ...
- spark未授权RCE漏洞
Spark简介 spark是一个实现快速通用的集群计算平台.它是由加州大学伯克利分校AMP实验室 开发的通用内存并行计算框架,用来构建大型的.低延迟的数据分析应用程序.它扩展了广泛使用的MapRedu ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之物理机配置-01
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之物理机配置-01 欢迎加QQ群:1026880196 进行交流学习 近期我发现网上有人转载或者复制 ...
- Maven相关知识总结
目录 认识Maven Maven下载安装 Maven能用来做什么 Maven核心概念 开发目录 坐标和仓库 POM文件 POM文件内容 Maven依赖管理 构建生命周期 构建多模块系统 聚合 继承 聚 ...