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

简介: 快速学习隐式转换丰富类库功能。

开发者学堂课程【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{

}

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
5天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1111 152
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1787 9
|
10天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
711 152
|
7天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
475 5
|
12天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
666 14