scala中的隐式类型转换的实现
scala语言中的隐式转换是一个十分强大的语言特性,主要可以起到两个作用:
一.自动进行某些数据类型的隐式转换
string类型是不能自动转换为int类型的,所以当给一个int类型的变量或常量赋予string类型的值时编译器将报错。所以,一下语句是错误的。
val x: int = "100"
如果需要将一个字符串类型的整形数值赋给int,比如使用string.toint方法,例如:
val 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中的隐式转换的用法:
class fraction(n: int, d: int) { // def den = d private val den = d; // def num = n 类参数定义为方法或字段都可以 private val num = n; // 定义乘法 def *(other: fraction) = fraction(other.num * this.num, other.den * this.den) // 重写tostring override def tostring() = s"$num / $den" } //伴生对象 object fraction { // implicit隐转 方法名无关可以随意改,自动调用 implicit def int2fraction(n: int) = fraction(n, 1) def apply(n: int, d: int) = { new fraction(n, d) } def unapply(frac: fraction) = if (frac.den == 0) none else some((frac.num, frac.den)) } object testfrac extends app{ // 3 隐式调用了int2fraction方法被转化为一个fraction对象fraction(3,1) val result = 3 * fraction(4,5) // 也可以显示调用 val result2 = fraction.int2fraction(5) * fraction(3,4) println(result) // unapply val fraction(num,den) = result println(num,den) }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Scala常用List列表操作方法示例
下一篇: cdr怎么绘制不同形状的图形?
推荐阅读
-
JavaEE基础day02 1.定义Java中的变量 四类八种 2.变量定义和使用的注意事项 3.数据类型的转换、强制数据类型转换4.算数运算符、比较运算符、逻辑运算符、赋值运算符、三元运算符
-
21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
-
powerdesigner中实现PDM到MYSQl数据库的转换_MySQL
-
C++中四种类型转换的关键字介绍及实例讲解
-
PHP中数据类型转换的三种方式,数据类型三种方式_PHP教程
-
JS实现的驼峰式和连字符式转换功能分析
-
JavaScript中的操作符类型转换(图文教程)
-
关于js中类型转换的一些小问题
-
php中实现xml与mysql数据相互转换的方法_php技巧
-
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)