scala中的隐式类型转换的实现

所属分类: 软件编程 / java 阅读数: 32
收藏 0 赞 0 分享

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)

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java Set简介_动力节点Java学院整理

Set最大的特性就是不允许在其中存放的元素是重复的。接下来通过本文给大家分享java set常用方法和原理分析,需要的的朋友参考下吧
收藏 0 赞 0 分享

Java Timezone类常见问题_动力节点Java学院整理

这篇文章主要介绍了Java Timezone类常见问题的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

javaWeb项目部署到阿里云服务器步骤详解

本篇文章主要介绍了javaWeb项目部署到阿里云服务器步骤详解,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解使用zxing库生成QR-Code二维码

这篇文章主要介绍了详解使用zxing库生成QR-Code二维码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现对服务器的自动巡检邮件通知

这篇文章主要为大家详细介绍了java实现对服务器的自动巡检邮件通知,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java随机验证码生成实现实例代码

这篇文章主要介绍了java随机验证码生成实现实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

java读取txt文件代码片段

这篇文章主要为大家详细介绍了java读取txt文件的代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java连接mysql数据库的方法

这篇文章主要为大家详细介绍了java连接mysql数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java 算法之快速排序实现代码

这篇文章主要介绍了java 算法之快速排序实现代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

这篇文章主要介绍了详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多