Scala学习笔记6 - 隐式转换和隐式参数

===显式类型转换

      正如之前所述的,scala中类型转换使用方法实现,以下是显式类型测试和显式类型转换的示例:

               a.isInstanceOf[String]  // 显式类型测试

               a.asInstanceOf[String] // 显式类型转换

 

===隐式转换、隐式参数

隐式转换

      隐式转换只是普通的方法,唯一特殊的地方是它以修饰符implicit开始,implicit告诉scala编译器可以在一些情况下自动调用(比如说如果当前类型对象不支持当前操作,那么scala编译器就会自动添加调用相应隐式转换函数的代码,将其转换为支持当前操作的类型的对象,前提是已经存在相应的隐式转换函数且满足作用域规则),而无需你去调用(当然如果你愿意,你也可以自行调用)。隐式转换函数定义如下:

                implicit def functionName(…) = {…}

      隐式转换满足以下规则:

      作用域规则:scala编译器仅会考虑处于作用域之内的隐式转换。隐式转换要么是以单一标识符的形式(即不能是aaa.bbb的形式,应该是bbb的形式)出现在作用域中,要么是存在于源类型或者目标类型的伴生对象中。

      单一调用规则:编译器在同一个地方只会添加一次隐式操作,不会在添加了一个隐式操作之后再在其基础上添加第二个隐式操作。

      显式操作先行规则:若编写的代码类型检查无误,则不会尝试任何隐式操作。

 

隐式参数

      柯里化函数的完整的最后一节参数可以被隐式提供,即隐式参数。此时最后一节参数必须被标记为implicit(整节参数只需一个implicit,并不是每个参数都需要),同时用来提供隐式参数的相应实际变量也应该标记为implicit的。对于隐式参数,我们需要注意的是:

      ①  隐式参数也可以被显式提供;

      ②  提供隐式参数的实际变量必须以单一标识符的形式出现在作用域中;

      ③  编译器选择隐式参数的方式是通过匹配参数类型与作用域内的值类型,因此隐式参数应该是很稀少或者很特殊的类型(最好是使用自定义的角色确定的名称来命名隐式参数类型),以便不会被碰巧匹配;

      ④  如果隐式参数是函数,编译器不仅会尝试用隐式值补足这个参数,还会把这个参数当作可用的隐式操作而使用于方法体中。

 

视界

      视界使用“<%”符号,可以用来缩短带有隐式参数的函数签名。比如,“T <% Ordered[T]”是在说“任何的T都好,只要T能被当作Ordered[T]即可”,因此只要存在从T到Ordered[T]的隐式转换即可。

      注意视界与上界的不同:上界“T<: Ordered[T”是说T是Ordered[T]类型的。

 

隐式操作调试

      隐式操作是scala的非常强大的特性,但有时很难用对也很难调试。

      有时如果编译器不能发现你认为应该可以用的隐式转换,你可以把该转换显式地写出来,这有助于发现问题。

      另外,你可以在编译scala程序时,使用“-Xprint:typer”选项来让编译器把添加了所有的隐式转换之后的代码展示出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值