[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 ...
随机推荐
- JS中EventLoop、宏任务与微任务的个人理解
为什么要EventLoop? JS 作为浏览器脚本语言,为了避免复杂的同步问题(例如用户操作事件以及操作DOM),这就决定了被设计成单线程语言,而且也将会一直保持是单线程的.而在单线程中若是遇到了耗时 ...
- 【JVM进阶之路】八:性能监控工具-命令行篇
定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段. 在实际的故障排查.性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用. 1.操作系统工具 1.1.top: ...
- 极简实用的Asp.NetCore模块化框架决定免费开源了
背景 在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块 ...
- mysql基础自学
1.1基础查询 语法:select 查询列表 from 表名;注意:1.查询列表可以是:表中的字段.常量值.表达式.函数2.查询的结果是一个虚拟表格 完整的写法是:先声明使用哪个库,再写SQL语 如果 ...
- Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step
翻译自 Mohamad Lawand 2021年1月22日的文章 <Asp Net Core 5 Rest API Authentication with JWT Step by Step> ...
- 使用Docker Toolbox 创建Docker虚拟机的方法-注意正确使用本地文件 file:参数的路径名
使用Docker Toolbox 创建v1.12.6版的Docker虚拟机的方法, 一定要注意正确使用本地文件 file:// 参数的路径名, 之前尝试创建过多次,一直都没有成功过, 无法使用 fil ...
- [Azure DevOps] 如何安装并配置 Build Agent
1. 编译服务器 在 Azure Pipelines 中至少需要一个编译服务器的 Agent 才能编译代码或发布软件.Azure DevOps 本身已经提供了一个 Agent,但出于各种理由(需要特殊 ...
- 【Git基本命令】
[基本指令] git init :使目标文件夹变成一个仓库 git add <文件名,含后缀> : 告诉git我要添加文件了 git commit -m "<提交说明> ...
- linux 更新python3.8
1 下载源码 地址 选版本下载即可,目前最新为3.8.2版本. 2 解压 tar -zxvf Python-3.8.2.tgz cd Python-3.8.2 3 新建安装目录 安装目录在/usr/l ...
- 由一名保安引发的Java设计模式:外观模式
目录 应用场景 外观模式 定义 意图 主要解决问题 何时使用 优缺点 结构 保安的故事 应用场景 使用方要完成一个功能,需要调用提供方的多个接口.方法,调用过程复杂时,我们可以再提供一个高层接口(新的 ...