[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 ...
随机推荐
- [解决] Assertion `srcIndex < srcSelectDimSize` failed.
在finetune Chinese GPT2的时候遇到如上错误,错误原因index越界,原始代码中给定的输入长度是1024,但是我使用模型可接受的输入长度是512,把输入长度都改为512,错误解决
- Spring Boot 2.3 新特性优雅停机详解
什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") p ...
- CrackMe_002
老规矩,先熟悉程序. 只有一个验证的功能,错误提示You Get ... 关闭没有nag窗口 第一种,暴力破解 查找字符串,很少,直接双击进入 可以看到错误提示的跳转来自: 表示这应该是个重要的跳转, ...
- VirtualBox虚拟机读取U盘
1 概述 使用VirtualBox虚拟机(系统Win10)读取宿主机(系统Manjaro)中的U盘. 2 安装扩展 戳这里下载对应版本的一个叫Oracle_VM_VirtualBox_Extensio ...
- Oracle-DG最大保护模式下,dg备库出现问题对主库有什么影响?
一.需求 疑问?Oracle最大保护模式下,dg备库出现问题,影响主库吗? 我们都知道Oracle最大保护模式的意思是oracle不允许数据丢失,1条记录都不行! 那么备库有问题? oracle主库还 ...
- Day05_18_类和对象的含义与关系
Java 类和对象 类的含义? 类属于引用数据类型,java语言中所有的.class都属于引用数据类型, 在类体当中,方法体之外定义的变量被称为 成员变量,成员变量若没有赋值,系统会默认赋值为0: 先 ...
- Redis 与 Python 交互
1. Python 库安装 2. 交互代码范例 3. Redis 操作封装 4. 应用范例:用户登录 1. Python 库安装 联网安装 pip install redis 使用源码安装 到中文官网 ...
- WinDBg定位asp.net mvc项目异常崩溃源码位置
项目介绍:asp.net mvc + angular +iis(windows)+windows server 系统莫名崩溃 最近有个系统默认奇妙崩溃50x,服务整体变成无响应,当运维告知我只有重启应 ...
- ListBox控件的另一种数据绑定方式
把DataTemplate防止ListBox中的绑定 <ListBox x:Name="ListBoxName"> <ListBox.ItemTemplate&g ...
- SpringBoot自动装配源码
前几天,面试的时候被问到了SpringBoot的自动装配的原理.趁着五一的假期,就来整理一下这个流程. 我这里使用的是idea创建的最简单的SpringBoot项目. 我们都知道,main方法是jav ...