Young's blog Young's blog
首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Young

首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Hadoop

    • 第一章 大数据技术之大数据概论
    • 第二章大数据技术之 Hadoop概念讲解
    • 第三章Hadoop 运行环境搭建
    • 第四章Hadoop之HDFS详解以及工作机制介绍
    • 第五章MapReduce编程框架
    • 第六章Hadoop 数据压缩
    • 第七章大数据技术之 Hadoop(Yarn)
    • 第八章Hadoop(生产调优手册)
    • Hadoop HA 高可用
    • Hadoop单节点伪分布式安装
    • hadoop 3.x 在windows10下编译
    • hadoop 踩坑记 DataNode 启动失败(ClusterID不一致):Initialization failed for Block pool
  • kafka

  • Flume

  • hive

  • scala

  • spark

  • 大数据
  • scala
andanyang
2023-11-03
目录

scala 第 10 章 隐式转换

# 第 10 章 隐式转换

当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用于将类型进行转换,实现二次编译

# 10.1 隐式函数

1)说明

隐式转换可以在不需改任何代码的情况下,扩展某个类的功能。

2)案例实操

需求:通过隐式转化为 Int 类型增加方法。

class MyRichInt(val self: Int) { 
    def myMax(i: Int): Int = {
    	if (self < i) i else self
    }

    def myMin(i: Int): Int = { 
    	if (self < i) 
    		self 
    	else 
    		i
    }
}

object TestImplicitFunction {
    // 使用 implicit 关键字声明的函数称之为隐式函数
    implicit def convert(arg: Int): MyRichInt = { 
        new MyRichInt(arg)
	}

    def main(args: Array[String]): Unit = {
    // 当想调用对象功能时,如果编译错误,那么编译器会尝试在当前作用域范围内查找能调用对应功能的转换规则,这个调用过程是由编译器完成的,所以称之为隐式转换。也称之为自动转换
        println(2.myMax(6))
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 10.2 隐式参数

普通方法或者函数中的参数可以通过 implicit 关键字声明为隐式参数,调用该方法时, 就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。

1)说明 (1)同一个作用域中,相同类型的隐式值只能有一个

(2)编译器按照隐式参数的类型去寻找对应类型的隐式值,与隐式值的名称无关。

(3)隐式参数优先于默认参数

2)案例实操

object TestImplicitParameter {

    implicit val str: String = "hello world!"

    def hello(implicit arg: String="good bey world!"): Unit = { 
    	println(arg)
    }

    def main(args: Array[String]): Unit = { 
    	hello
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 10.3 隐式类

在 Scala2.10 后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,在集合中隐式类会发挥重要的作用。

1)隐式类说明

(1)其所带的构造参数有且只能有一个

(2)隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。

2)案例实操

object TestImplicitClass {
    implicit class MyRichInt(arg: Int) { 
        def myMax(i: Int): Int = {
        	if (arg < i) i else arg
        }

        def myMin(i: Int) = {
        	if (arg < i) arg else i
        }
     }

    def main(args: Array[String]): Unit = { 
    	println(1.myMax(3))
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 10.4 隐式解析机制

1)说明

(1)首先会在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)。( 一般是这种情况)

(2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生对象以及该类型所在包的包对象。

2)案例实操


//(2)如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生模块,
object TestTransform extends PersonTrait { 
    def main(args: Array[String]): Unit = {
        //(1)首先会在当前代码作用域下查找隐式实体
        val teacher = new Teacher() 
        teacher.eat()
        teacher.say()
    }

    class Teacher {
    	def eat(): Unit = { println("eat...")}
    }
}

trait PersonTrait {

}

object PersonTrait {
    // 隐式类 : 类型 1 => 类型 2
    implicit class Person5(user:Teacher) {

    	def say(): Unit = { println("say...")}
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
编辑 (opens new window)
上次更新: 2024/04/19, 08:52:45
最近更新
01
idea 热部署插件 JRebel 安装及破解,不生效问题解决
04-10
02
spark中代码的执行位置(Driver or Executer)
12-12
03
大数据技术之 SparkStreaming
12-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Young | MIT License
浙ICP备20002744号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式