开发者学堂课程【Scala 核心编程-基础:隐式转换的必要性和入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9006
隐式转换的必要性和入门
内容介绍:
一、提出问题
二、隐式函数基本介绍
三、隐式函数快速入门
四、整理
一、提出问题
先看一段代码,引出隐式转换的实际需要=>指定某些类型的相互转换,可以根据自己需求进行指定
package com.atguigu.scala.conversion
object Scala01 {
def main(args: Array[String]):Unit = {
val num: Int=3.5
//?错高精度->低精度 加 tolnt,如果一个文件中有大量这种东西很麻烦
println(num)
}
}
二、隐式函数基本介绍
隐式函数不是指函数是隐式的,是指功能是隐式的,隐式转换函数是以 implicit 关键字声明的带有单个参数的函数,多个不可以。这种函数将会自动应用,将值从一种类型转换为另一种类型。这个类型自己指定。
三、隐式函数快速入门
1、使用隐式函数可以优雅的解决数据类型转换,以前面的案例入门。
2、创建一个章节,chapter09。
新建文件,命名为 ImplicitDemo01。
package com. atguigu. chapter09
Object ImplicitDemo01 {
def main(args: Array[String]): Unit = (
//编写一个隐式函数转成 Double- >Int 转换,这个类型要指定,它不是万能的。
隐式函数不能乱写,要在作用域里面。
//隐式函数应当在作用域才能生效
implicit def f1(d: Double): Int= { //
底层生成
f
1$1
d.tolnt
}
//Double 是输入类型, Int 是转换后的类型
Val num : Int = 3.5 //底层编译 f1$1(3.5)
跑起来之后,这里会出现实体的下划线,之后再看到下划线说明它一定使用了隐式转换,对于阅读Scala源代码会很有帮助。因为有时代码是写在这里的,有可能 implicit 看不到,但是只要看到下划线就知道它运用了隐式转换。
不需要每个地方都写 d.tolnt
println("num =" + num)
}
}
运行,结果如下:没有问题
Num
=3
编辑器做了很多工作。
打开反编译工具,查看源代码,打开 chapter09。点击 ImplicitDemo01.class。
int num = f1$1(3.5D);
Predef. .MODJLE$ . println (new StringBuilder () .append ("num =") . append (Boxe sRunTime . boxToInteger (num) . toString());
private final int f1$1 (double d)
隐式函数
return (int)d; 底层用的 javascript
private ImplicitDemo01$ ()
MODULE$ = this;
四、整理
1、提出问题
(1)首先提出隐式转换的问题,引起大家思考,引出隐式转换的必要性,如果没有隐式转换,每个地方都需要tolnt,很麻烦。
(2)先看一段代码,引出隐式转换的实际需要=>指定某些数据类型的相互转化。
package com.atguigu.scala.conversion
object Scala01
{
def main(args: Array[String]): Unit=
{
val num: Int=3.5/
/?错 高精度->低精度
println(num)
}
}
2、隐式函数基本介绍
隐式转换函数是以 implicit 关键字声明的带有单个参数的函数。这种函数将会自动应用,将值从一种类型转换为另一种类型。
3、隐式函数快速入门
使用隐式函数可以优雅的解决数据类型转换,以前面的案例入门。
代码演示:
package com. atguigu. chapter09
Object ImplicitDemo01 {
def main(args: Array[String]): Unit = (
//编写一个隐式函数转成 Double- >Int 转换
//隐式函数应当在作用域才能生效
implicit def f1(d: Double): Int= { //
底层
生成
f
1$1
d.tolnt
}
Val
num :
Int =
3.5
//
底层编译
f
1$1(3
.
5)
println("num =" + num)
}
}
反编译后的代码:
public final class ImplicitDemo01$
{
public static final MODULE$;
Static
{
new ();
}
public void main(String[] args)
{
int num = f1$1(3.5D);
做了一个包,封装
Predef. .MODULE$.println (new StringBuilder() .append("num =") .append (Boxe sRunTime . boxToInteger (num)) . toString
(
)
)
;
}
private final int f1$1 (double d)
隐式函数变成这个,Implicit 是给编译器看的,底层还是这个函数
{
return (int)d;
}
private ImplicitDemo01$ ()
{
MODULE$ = this;
}
}