隐式转换丰富类库功能|学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 快速学习隐式转换丰富类库功能。

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

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


隐式转换丰富类库功能

 

内容介绍

基本介绍

分析解决方案

快速入门案例

整理

 

一、基本介绍

1、用隐式转换的功能丰富类库

2、如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为 MySQL 类增加一个delete方法

 

二、分析解决方案

1、在当前程序中,如果想要给 MySQL 类增加功能是非常简单的,但是在实际项目中,如果想要增加新的功能就会需要改变源代码,这是很难接受的。而且违背了软件开发的 OCP 开发原则。(闭合原则 open close priceple),OCP开发原则的观点是修改代码被关闭增加功能被开放OCP 原则在设计模式还会介绍后面会介绍一种模式这种模式非常轻松的增加功能

2、在这种情况下,可以通过隐式转换函数给类动态添加功能。

 

三、快速入门案例

使用隐式转换方式动态的给 MySQL 类增加 delete 方法。

希望 MySQL 实例使用到 delete 方法但是不能把 delete 直接拷贝过来

class MySQL{

def insert(): Unit = {

printÍn("insert")  insert方法

}

}

class DB {

def delete(): Unit = {

println("delete")     delete方法

}

}

implicit def addDelete(mysql:MySQL): DB = {  函数名随意写f1,f2都可以虽然传了一个 MySQL 对象但是实际上根本就没有用它这个形参只有一个作用就是让编译器找到它匹配到它

new DB

}

val mysql = new MySQL

mysql. insert()

mysql.delete() //?

//[案例演示+反编译]

创建 ImplicitDemo02选择 object

package com. atguigu. chapter09

object ImplicitDemo02 {

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

//编写一个隐式函数丰富 mysql 对象的功能

如果不写关键字编译器是不会做转换的

Implicit adddeletemsqlmysql):DB={ 如果把 Implicit 写到外面函数名就是 adddelete

New DB

}

如果把隐式函数放到外面一样可以用Implicit 仍然是 ImplicitDemo02的方法那么在这里用没有问题但是放在别的类中不行编译器找不到所以隐式函数不能乱写要让编译器找的到它只要让编译器在作用域上识别它就可以很多程序员专门把隐式函数写一个文件也是一个很好的思路

如果把 Implicit 放到主函数里面那么 adddeleteMySQL).delete()变成 adddelete$1(MySQL).delete()

//创建 mysql 对象

Val mySQL=new MySQL

mySQL. insert()

mySQL. delete( )//编译器工作 分析 adddeleteMySQL).delete(),传进去返回 DB

只要看见下划线它就是用了隐式转换源代码很多难的就是隐式转换

mySQL.update( )因为返回的是 DB 对象实例

}

}

class MySQL {

Def insert(): Unit = {

println(" insert")

}

}

class DB {

def delete(): Unit = {

println("delete" )

}

def update():Unit={

println("update" )

}

}

Class dog{

}

运行结果如下没有问题

insert

Delete

运行后打开反编译软件打开 ImplicitDemo02.class

package com. atguigu . chapter09;

public final class ImplicitDemo02$

{

public static final MODULE$;

static

{

new () ;

}

public void main (String[] args)

{

MvSQL mySQL = new MvSQL() ;

mySQL. insert();

addDslete$1 (mySQL) .delete(); 前面已经是 DB 对象实例

}

private final DB addDelete$1 (MySQL msql)

{

return new DB() ;

}

private Implici tDemo02$ ()

{

MODULE$ . this;

}

}

就相当于隐式的增加一个功能

 

四、整理

快速入门案例

使用隐式转换方式动态的给 MySQL 类增加 delete 方法

案例代码

package com. atguigu. chapter09

object ImplicitDemo02 {

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

//编写一个隐式函数丰富 mysql 对象的功能

Implicit adddeletemsqlmysql):DB={

New DB

}

//创建 mysql 对象

Val mySQL=new MySQL

mySQL. insert()

mySQL. delete( )//编译器工作 分析 adddeleteMySQL).delete(),传进去返回 DB

mySQL.update( )

}

}

class MySQL {

Def insert(): Unit = {

println(" insert")

}

}

class DB {

def delete(): Unit = {

println("delete" )

}

def update():Unit={

println("update" )

}

}

Class dog{

}

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 Java
Java入门——数据类型、自动类型转换、强制类型转换
Java入门——数据类型、自动类型转换、强制类型转换
43 2
|
7月前
|
安全 Java 编译器
【Java开发指南 | 第四篇】Java常量、自动类型转换、修饰符
【Java开发指南 | 第四篇】Java常量、自动类型转换、修饰符
56 4
|
7月前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
149 0
|
JavaScript 安全
带你读《现代TypeScript高级教程》十三、类型兼容:协变和逆变(2)
带你读《现代TypeScript高级教程》十三、类型兼容:协变和逆变(2)
|
JavaScript Java
带你读《现代TypeScript高级教程》十三、类型兼容:协变和逆变(1)
带你读《现代TypeScript高级教程》十三、类型兼容:协变和逆变(1)
|
Java
Java基本语法(7)--赋值运算符及其扩展
Java基本语法(7)--赋值运算符及其扩展
58 0
|
Java C++
JavaSE (三)原生数据类型的8种类型定义、使用和陷阱
可以将表示数据范围小的值赋予表示范围大的变量;不能直接将表示范围大的值赋给表示范围小的变量,如果非要转换,只能通过强转类型实现。
127 0