隐式类详解|学习笔记

简介: 快速学习隐式类详解。

开发者学堂课程【Scala 核心编程-基础:隐式类详解】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/9010


隐式类详解

 

内容介绍

一、基本介绍

二、应用案例

三、整理

 

一、基本介绍

1、在 scala2.10后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用。

2、隐式类使用有如下几个特点:

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

(2)隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类,不能是顶级的(top-level objects)。不能单独的放在外面。作用域无法确定是哪个范围,也就是失去作用域,要有一个具体的范围。不是编译器不能支持,而是编译器它认为隐式类一定要在一个范围内,不可能让整个程序都作用。

(3)隐式类不能是 case class 样例类 (case class 在后续介绍)。

(4)作用域内不能有与之相同名称的标识符。比如这里写了一个隐式类叫 DB1,就不能在同一个作用域下有 DB1。


二、应用案例

1、看一个关于隐式类的案例,进一步认识隐式类。

classs MySQL1 {  一个方法

def sayOk(): Unit = {

println("sayOk")

}

}

def main(args: Array[String]): Unit ={

//DB1会对应生成隐式类

implicit class DB1(val m: MySQL1) {   形参,val m: MySQL1是构造器,它可以传入一个形参。它在底层会生成一个类,这个类的类名是 ImplicitClass$DB1$2

def addSuffix(): String = {

m + " scala'

}

}隐式类写好

val mysql1 = new MySQL1

mysql1. sayOk()

//mysql1. .addSuffix() ==> DB1$1(mysql1) .addSuffix()

//DB1$1(mysql1 )返回的类型是 ImplicitClass$DB1$2

println(mysql1. addSuffix()}

}/案例演示+说明

它会在创建 MySQL1实例时自动发生隐式转换,说明可以使用隐式类中所使用的方法,DB1$1就是 MySQL1中的构造器,再调用Suffix,它返回的参数就是隐式类类型。

2、新建一个文件,ImplicitClassDemo,选择 object。

新建一个主函数。

package com. atguigu. chapter09

object ImplicitclassDemo {

def main(args: Array[String]): Unit = {

//DB1会对应生成隐式类

//DB1是一个隐式类,当我们在该隐式类的作用域范围,创建一个 mysql1 的实例,该隐式类就会生效,这个工作仍然是编译器完成

//看底层··

implicit class DB1(val m: MySQL1) {  

def addSuffix(): String = {

m + " scala'

}

}

}

}

class MySQL1 {

Def say0k(): Unit = {

println("sayOk" )

}

}

运行,打开反编译工具,找到 ImplicitClassDemo$.class 打开。找到主函数

public class ImplicitClassDemo$DB1$2,$2代表编号

private final MySQL1 m;   val 作为只读的属性,实际上就是主构造器

addsuffix 启动

public ImpIicitCla33Demo$DB1$2 (MySQL1 m) 主构造器传了一个 MySQL1返回需要的类型

生成 ImplicitassDemo$DB1$2

3、package com. atguigu. chapter09

object ImplicitClassDemo {

def main(args: Array[string]): Unit = {

//DB1会对应生成隐式类

//DB1是一个隐式类,当我们在该隐式类的作用域范围,创建 MySQL1 实例

//该隐式类就会生效,这个工作仍然编译器完成

//看底层..

implicit class DB1(val m: MySQL1) {//ImplicitClas sDemo$DB1$2

def addsuffix(): string = {

m+"scala"

}

}

//创建一个 MySQL1实例

Val MySQL=new MySQL1

MySQL1.sayok()

MySQL.addsuffix()//研究如何关联到关联的 DB1的方法

运行结果如下:

Sayok

def addsuffix(): string = {

m+"scala"

这段代码应该也执行了,只是没有输出这句话。

打开反编译工具,点击 ImplicitClassDemo.class。

package com. atguigu. chaptero9;

public final class Imp1 icitclassDemo$

{

public static final MODULE$;

Static

{

new () ;

}

public void main (String[] args)

{

MvSQL1 mySQL . new MySQL1 ();

mySQL.sayOk();

DB1$1 (mySQL) . addSuffix();   相当于构建了隐式类的实例,靠这个地方关联的

}

private final ImplicitClassDemo. DB1.2 DB1$1 (MvSQL1 m) 是这里返回的DB1

{

return new ImplicitClassDemo.DB1.2 (m) ;

}

private ImplicitClassDemo$ ()

(

MODULE$ = this;

}

}

相当于把 MvSQL1传进去,返回 DB1实例,然后就可以用 addsufiix 方法。

 

三、整理

1、在 scala2.10后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用。

2、隐式类使用有如下几个特点:

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

(2)隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类,不能是顶级的(top-level objects)。作用在整个程序不合理。

(3)隐式类不能是 case class 样例类 (case class 在后续介绍)。

(4)作用域内不能有与之相同名称的标识符。

3、应用案例

看一个关于隐式类的案例,进一步认识隐式类。

package com. atguigu. chapter09

object ImplicitclassDemo {

def main(args: Array[String]): Unit = {

//DB1会对应生成隐式类

//DB1是一个隐式类,当我们在该隐式类的作用域范围,创建一个 mysql1 的实例,该隐式类就会生效,这个工作仍然是编译器完成

//看底层··

implicit class DB1(val m: MySQL1) {  

def addSuffix(): String = {

m + " scala'

}

}

}

}

class MySQL1 {

Def say0k(): Unit = {

println("sayOk" )

}

}

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
12月前
|
JavaScript API 数据处理
基于HarmonyOS 5.0 (Next)技术的渐变模糊效果技术实现【代码实战】
本文详细介绍如何在HarmonyOS 5.0(Next)中实现渐变模糊效果,涵盖从基础页面搭建到添加模糊、渐变效果的全过程,并通过代码实战展示具体操作步骤。文章首先介绍了使用`Stack`和`Image`控件设置背景并应用`foregroundBlurStyle`属性实现模糊效果,接着通过`linearGradient`属性融入渐变效果,使界面更加精致美观。此外,还展示了如何利用滑动条和手势等交互元素动态调整模糊与渐变效果,增强用户体验。最后,通过具体代码示例说明如何为图片、弹窗等控件添加渐变模糊效果,突显HarmonyOS的强大功能与灵活性。
517 17
|
Kubernetes Linux 网络安全
基于eBPF的微服务网络安全
基于eBPF的微服务网络安全
285 2
|
人工智能 搜索推荐 小程序
无广告,直达结果的AI搜索引擎
在信息海洋中寻找知识,却常被广告和无关结果困扰?秘塔AI搜索能完美解决这些问题。它无广告、直达结果,全网搜索内容提炼整合,并提供思维导图、相关事件及参考来源,让你高效获取精准答案。快来体验吧![访问地址](https://metaso.cn/)
499 6
无广告,直达结果的AI搜索引擎
提升个人工作技能
提升个人工作技能
1247 6
|
机器学习/深度学习 人工智能 搜索推荐
AI与未来医疗:重塑健康的双刃剑
【10月更文挑战第6天】 人工智能作为现代科技的巅峰之作,已经渗透进我们生活的方方面面。从语音助手到自动驾驶,AI不仅改变了我们的日常,更在各个专业领域,特别是医疗行业,扮演着愈发重要的角色。本文探讨了AI在未来医疗中的应用及其潜在影响,揭示了这把“双刃剑”的机遇与挑战。
428 1
|
监控 前端开发 JavaScript
ARMS集成监控代码
【8月更文挑战第24天】
381 6
|
编解码 数据安全/隐私保护
无影云电脑产品使用黑神话悟空之游戏画面卡顿的推荐设置
这段内容介绍了无影云电脑在运行《黑神话:悟空》时遇到画面卡顿等问题的推荐设置与解决方案,包括调整分辨率和显示模式等方法,并提供了多个具体问题的详细解答及参考链接,帮助用户优化游戏体验。
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
226 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
监控 Kubernetes Linux
在Linux中,如何排查性能下降问题?
在Linux中,如何排查性能下降问题?