码迷,mamicode.com
首页 > 其他好文 > 详细

Scala 中的隐式转换 implicit

时间:2014-09-01 17:26:03      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:style   http   io   使用   数据   html   sp   on   c   

  Scala语言中的隐式转换是一个十分强大的语言特性,主要可以起到两个作用:

.自动进行某些数据类型的隐式转换

  String类型是不能自动转换为Int类型的,所以当给一个Int类型的变量或常量赋予String类型的值时编译器将报错。所以,一下语句是错误的。

  val x: Int = "100"

  如果需要将一个字符串类型的整形数值赋给Int,比如使用String.toInt方法,例如:

  v al x: Int = "100".toInt

  如果想让字符串自动转换为整形,就可以使用隐式转换。可以定义如下函数。

  implicit def strToInt(str: String) = str.toInt

  这时你再对Int类型的变量赋值字符串时,字符串就会自动转换为Int

  scala> val x:Int = "00"

  x: Int = 100

  如果你此时定义一个两数相加的函数

  def add(x: Int, y: Int) = x + y

  就可以达到这种效果:

  scala> add("100", 200)

  res1: Int = 300

  隐式转换有一定的使用规则,比较重要的有2个。

    1.按照《Scala编程》这本书中所说:插入的隐式转换必须以单一标识符的形式处于作用域中,或与转换的源或目标类型关联在一起。Scala编译器将仅考虑处于作用域之内的隐式转换。

    简而言之,就是在使用隐式转换之前,需要用import把隐式转换引用到当前的作用域里或者就在作用域里定义隐式转换。除了隐式转换被引入进当前作用域之外,还有一种方式可以使用隐式转换,就是编译器会在源类型或者期望的伴生对象中寻找隐式定义。

    2.无歧义规则:隐式转换只能在无其他可用转换的前提下才能操作。如果在同一作用域里,对同一源类型定义一个以上的隐式转换函数,如果多种隐式转换函数都可以匹配,那么编译器将报错,所以在使用时请移除不必要的隐式定义。

二.隐式参数

  柯里化函数会有多个参数列表,当希望对某个参数列表采用默认参数时,可以使用implicit提供的隐式参数功能。做法是在需要自动填充的参数列表最开端加上implicit,然后在定义域内定义需要填充的默认参数值常量,并在常量的定义之前声明implicit

 

视界

当有如下定义时

class Container[A <% Int] { def addIt(x: A) = 123 + x }

表示A类型必须可视为Int。简单的说,就是需要有一个转换函数,可以自动的将A类型,转换为Int类型,如果没有这样的转换函数,可以使用implicit定义。

 

 

参考文章:

Scala编程》第21

Twitter Scala School 高级类型》

http://twitter.github.io/scala_school/zh_cn/advanced-types.html

 

Scala 中的隐式转换 implicit

标签:style   http   io   使用   数据   html   sp   on   c   

原文地址:http://www.cnblogs.com/matrixc/p/3949476.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!