隐式转换的时机和机制|学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 快速学习隐式转换的时机和机制。

开发者学堂课程【Scala 核心编程-基础:隐式转换的时机和机制】学习笔记,与课程紧密联系,让用户快速学习知识。

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


隐式转换的时机和机制

 

内容介绍

隐式的转化时机

、隐式解析机制

 

一、隐式的转化时机

1、当方法中的参数的类型与目标类型不致时,会产生隐式转换

2、当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型)。

3、假如没有 mySQL . addSuffix( )那么 new mySQL1不会跟 DB1发生关联消息但是 sayok()没有下划线addsuffix()有下划线编译器扫描 mySQL 的作用域发现有一个隐式类可以用

//创建一个 MySQL1实例

val mySQL = new MySQL1

mySQL . sayOk( )

mySQL.addsuffix() //研究如何关联到 DB1$I (mySQL). addsuffix();

4、当方法中的参数的类型与目标类型不致时也会转换

implicit def f1(d: Double)int={接收 double 类型

d.toint

}

Def test1(n1: Int): Unit={

println("ok'

}

Test1(10.1)理论上报10是对的但是报1就错了类型不匹配隐式类型会出现在范围内去找找到就会用找不到就报错

赋值的本质底层也可能是一个函数

}

}

class DB1{}

成功运行

5、整理

(1)当方法中的参数的类型与目标类型不致时,或者是赋值时。

implicit def f1(d:Double): Int = {

d. toInt

}

def test1(n1:Int): Unit = {

println("ok")

}

test1(10.1 )

(2)当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型)


二、隐式解析机制

即编译器是如何查找到缺失信息的,解析具有以下两种规则:

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

2、如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找。类型的作用域是指与该类型相关联的全部伴生模块,一个隐式实体的类型T它的查找范围如下(第二种情况范围广且复杂在使用时,应当尽量避免出现第二种情况):

(1)如果 T 被定义为 T with A with B with C,那么 A,B,C 都是 T 的部分,在 T 的隐式解析过程中,它们的伴生对象都会被搜索。

(2)如果 T 是参数化类型,那么类型参数和与类型参数相关联的部分都算作T的部分,比如 List[String]的隐式搜索会搜索 List 的伴生对象和 String 的伴生对象。

(3)如果T是一个单例类型 p.T,即 T 是属于某个 p 对象内,那么这个 p 对象也会被搜索。

(4)如果 T 是个类型注入 S#T,那么 S 和 T 都会被搜索。

主要是第一种要了解第二种直到即可正常情况下不会用这么复杂的解析

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
IDE 开发工具 开发者
IDLE的运行方式
IDLE的运行方式
1624 3
|
Java
什么是Java中的类和对象?它们之间有什么区别?
【4月更文挑战第12天】Java中,类是面向对象编程的基础,是对象的模板,封装数据和方法,描述共享属性和行为。对象是类的实例,具有独特属性和行为,代表具体的个体。类与对象间是抽象与具体的关联,类是事物抽象描述,对象是其具体体现。
188 2
|
3月前
|
安全 Java 编译器
Java类型提升与类型转换详解
本文详解Java中的类型提升与类型转换机制,涵盖类型提升规则、自动类型转换(隐式转换)和强制类型转换(显式转换)的使用场景与注意事项。内容包括类型提升在表达式运算中的作用、自动转换的类型兼容性规则,以及强制转换可能引发的数据丢失和运行时错误。同时提供多个代码示例,帮助理解byte、short、char等类型在运算时的自动提升行为,以及浮点数和整型之间的转换技巧。最后总结了类型转换的最佳实践,如避免不必要的转换、使用显式转换提高可读性、金融计算中使用BigDecimal等,帮助开发者写出更安全、高效的Java代码。
223 0
|
关系型数据库 MySQL 索引
MySQL数据表添加字段的三种方式
MySQL数据表添加字段的三种方式
9414 0
|
3月前
|
人工智能 Java
Java判断与循环语句详解​
程序执行过程中,语句的执行顺序对结果有直接影响。流程控制分为顺序结构、判断和选择结构(如 if、switch)以及循环结构(如 for、while、do…while)。顺序结构按代码顺序依次执行;判断结构根据条件选择执行路径;循环结构则在条件满足时重复执行代码块。此外,break 和 continue 可用于控制循环流程,而 Random 类可生成随机数。掌握这些结构能有效控制程序逻辑。
|
7月前
|
存储 Java
Java 中的值传递与拷贝机制详解
本文深入解析了Java中的值传递与拷贝机制,澄清了“值传递”和“引用传递”的概念混淆。Java仅支持值传递,对象变量传递的是引用的副本,导致方法内可修改对象内容但不会改变引用地址。同时探讨了浅拷贝与深拷贝的区别,前者仅复制引用,后者创建全新对象以确保独立性。文章结合实例分析基本数据类型、对象、数组及集合在传递和复制时的行为,帮助读者全面理解Java内存管理与对象操作原理。
151 10
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
491 2
java基础(9)数据类型中的char类型以及涉及到的转义字符
|
Java C语言
Java——类与对象
这段内容介绍了Java中的类和对象、`this`关键字及构造方法的基本概念。类是对现实世界事物的抽象描述,包含属性和方法;对象是类的实例,通过`new`关键字创建。`this`关键字用于区分成员变量和局部变量,构造方法用于初始化对象。此外,还介绍了标准JavaBean的要求和生成方法。
113 7
Java——类与对象
|
Java 开发者
Java Character 类详解
Java中的`Character`类是`java.lang`包的一部分,用于将基本类型`char`封装为对象,并提供了丰富的静态方法来处理字符,如类型判断、大小写转换等。
414 9
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
1352 1