scala中隐式转换
Posted Leo Han
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala中隐式转换相关的知识,希望对你有一定的参考价值。
scala中默认的情况下支持数值类型的自动转换
byte->short->int->long
scala默认情况下支语法中的类型的自动转换
child -> parent -> trait(interfact)
scala中也允许开发人员自定义类型转换规则,将两个无关的类型通过编程手段让他们可以自动转换
隐式转换注意事项
- 隐式转换的函数名可以是任意的,与函数名无关,与函数签名有关
- 隐式函数可以有多个,但是需要保证当前环境下只有一个隐式转换函数能够被识别
隐式值
隐式值也叫隐式变量,将某个形参表示为implicit,编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺省参数
implicit test:String
def test(implicit name:String ="zhangsna"):Unit =
println("hello"+name)
test
def main(args :Array[String]):Unit =
implicit val username:String = "wangwu"
def test(implicit name:String ="zhangsna"):Unit =
println("hello"+name)
test("zhangsna")
test()
test
test 打印wangwu
test() 打印zhangsan, 使用小括号会导致隐式值无法专递,实际上就是调用了传参
如果上面在有一个 val name2=“lisi”
test 会报错
如果隐式参数存在默认值以及对应类型的隐式值,那么会优先采用隐式值,如果找不到,那么会使用默认值,如果没有默认值,那么会报错
scala 2.10后提供了隐式类,可以使用implict声明类型,隐式类非常强大,可以扩展类的功能,隐式类使用有如下几个特点:
- 构造参数有且只能有一个
- 隐式类必须被定义在类或伴生对象或包对象里,隐式类不能是顶级的
- 隐式类不能是case class
- 作用域内不能有与之相同名称的标识符
def main(args :Array[String])
val user = new User()
user.insert()
user.delete()
implici class Person(u:User)
def delete()
class User
def insert()
隐式转换的时机
- 当方法中的参数类型与目标类型不一致时
- 当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换
隐式解析机制
隐式解析机制(编译器如何查找确实信息),根据如下两种规则:
- 首先会根绝在当前代码作用域下查找隐式实体(隐式方法、隐式类、隐式对象)
- 如果第一条规则朝招隐式实体失败,会继续在隐式参数的类型的作用域里查找(类型的作用域是指该类型相关联的全部伴生模块,一个隐式实体类型T的查找范围如下:
- 如果T被定义为T with A with B with C ,那么A,B,C都是T的部分,在T的隐式解析过程中,他们的伴生对象都会被搜索
- 如果T是参数化类型,那么类型参数和与类型参数相关联的部分算作T的部分,比如List[String] 的隐式搜索不搜索List的伴生对象和S听伴生对象
- 如果T是一个单例类型p.T,即T是属于某个p对象内,那么这个p对象也会被搜索
- 如果T是类型注入S#T,那么S和T都会被搜索
以上是关于scala中隐式转换的主要内容,如果未能解决你的问题,请参考以下文章