[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 ...
随机推荐
- Android Studio详解项目中的资源
•目录结构 •作用 所有以 drawable 开头的文件都是用来放图片的: 所有以 mipmap 开头的文件都是用来放应用图标的: 所有以 value 开头的文件夹都是用来放字符串.样式.颜色等配置的 ...
- SQLserver数据库安装教程
大家好,这期给大家带来一期SQL server的安装教程 下载SQL Server 2019 Developer 官方网址: https://www.microsoft.com/zh-cn/sql-s ...
- Dynamics CRM安装教程一:域环境准备
服务器环境:Windows Service 2016 Stand Windows域是计算机网络的一种形式,其中所有用户账户,计算机,打印机和其他安全主体都在位于称为域控制器的一个或多个中央计算机集群上 ...
- 6.2set用法
目录 1.set的定义 2.set容器内元素的访问 3.set常见使用的函数 set可以内部进行自动递增排序,且自动去除了重复元素 1.set的定义 set<typename> name; ...
- 1.PreparedStatement VS Statement
两者都是Sun公司定义的接口,PreparedStatement属于Statement的子接口.二者类似信使,向数据库中执行sql语句: Statement存在拼串的操作,比较繁琐:存在SQL注入问题 ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之替换logo-13
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之替换logo-13 欢迎加QQ群:1026880196 进行交流学习 替换 openstack das ...
- 16. Vue2.4+新增属性$attrs
vm.$attrs简介 首先我们来看下vue官方对vm.$attrs的介绍: 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外).当一个组件没有声明 ...
- C++ Primer Plus(第6版)中文版电子版awz+epub+mobi三版
电子书资源:C++ Primer Plus(第6版)中文版 书籍简介: C++是在C语言基础上开发的一种集面向对象编程.通用编程和传统的过程化编程于一体的编程语言,是C语言的超集.<C++ ...
- Day12_59_Java多线程
多线程 1. 什么是进程? * 每个进程是一个应用程序,都有独立的内存空间,一个进程对应一个应用程序. * 例如:在windows操作系统中启动了word就是启动了一个进程,一边听音乐,一边打游戏就是 ...
- 哈工大LTP基本使用-分词、词性标注、依存句法分析、命名实体识别、角色标注
代码 import os from pprint import pprint from pyltp import Segmentor, Postagger, Parser, NamedEntityRe ...