scala 随笔(4) implicit 隐式转换 和冲突解决
来源:互联网 发布:面向对象编程的优势 编辑:程序博客网 时间:2024/06/05 12:45
scala 的隐式转换类似于C#的扩展,也类似于extends,也就增加对象方法或者属性。
主要是对对象进行方法的扩展
例如:
class Implicit(val x :Int){
def f = x+1;
}
object Implicit {
def main(args: Array[String]): Unit = {
val myImplicit = new Implicit(2);
println(myImplicit.f)
// println(myImplicit.y) //目前编译是不同过的
}
}
如果需要对Implicit进行方法扩展,可以
class Implicit(val x :Int){ def f = x+1;}object Implicit { implicit class anyName(s:Implicit) { //这里 def y = 10+s.x } def main(args: Array[String]): Unit = { val myImplicit = new Implicit(2); println(myImplicit.f) println(myImplicit.y) //这里 }}
class 后面的anyName 代表这个类名不重要,重要的是implicit 这个关键字,以及输入的参数(S:Implicit)
当然你可能想直接将def y=10,放在上面Implicit里面不就可以了。
如果你能这么想,说明你很聪明了,但是如果是String这个类呢。你不可能去改源代码吧,难道为了一个方法写一个类。
2) 省略方法
再看一个例子。
object Implicit { implicit def translate(s:Double) ={ s.toInt } def main(args: Array[String]): Unit = { val x:Int = 4.5 }}
将一个double 转换成了int型,背后是省去了translate这个方法。
这个implicit 也有冲突的时候,
如果冲突出现,必须指明是调用了哪个方法。
3)冲突解决
比如:
object Implicit {
implicit def translate(s:Int) ={
s.toString.toList.mkString(":")
}
implicit def translate2(s:Int) ={
s.toString.toList.mkString(":")
}
def main(args: Array[String]): Unit = {
val x:Int =123;
val y :String = x + 12
println(y)
}
}
编译不通过
如果 没有translate2 ,将输出1:3:5
这个时候需要指明是调用哪个translate2
当与系统默认的方法冲突是,会首先调用默认方法,这里调用默认方法+ ,不会调用的translate
object Implicit { implicit def translate(s:Int) ={ s.toString.toList.mkString(":") } def main(args: Array[String]): Unit = { val x:Int =123; val y :String = x + "12" println(y) }}
输出:135
到此结束
有问题可以留言
阅读全文
0 0
- scala 随笔(4) implicit 隐式转换 和冲突解决
- scala implicit 隐式转换
- scala implicit隐式转换
- Scala implicit隐式转换
- scala implicit 隐式转换
- scala implicit 隐式转换
- scala implicit 隐式转换
- scala implicit 隐式转换
- scala隐式转换implicit
- scala 随笔(3)trait 和trait冲突解决
- 【Spark-Scala语法】implicit(隐式转换)关键字详解
- 【scala 笔记(9)】 隐式转换 和 隐式参数-- implicit
- scala学习笔记2-隐式转换implicit
- 关于Scala的implicit(隐式转换)的思考
- scala的implicit关键字----不仅仅是隐式类型转换
- scala隐式参数(implicit)
- scala隐式参数(implicit)
- scala隐式参数(implicit)
- 基于S3C2440的busybox的移植---解决FL2440的shell指令不能自动补全
- div模拟textarea高度随文本变化
- 一个手风琴效果的jquery动画
- 值得学习的C/C++语言开源项目
- Ubuntu 下 NFS环境的搭建
- scala 随笔(4) implicit 隐式转换 和冲突解决
- AJax请求数据用Jquary向select追加<option>
- R语言遗传算法
- 自定义Stack、Queue类
- C++输入输出
- 计算组合数
- Python自动测试打开chrome时,chrome地址栏总是出现data:;
- solidity数据结构
- HDU 1495 喝可乐(BFS)