跟连乐一起学Scala-隐式转换

隐式转换

定义:

以implicit关键字声明的带有单个参数的函数。

implicit def int2Fraction(n: Int) = Fraction(n, 1)

val result = 3 * Fraction(4, 5) //调用int2Fraction(3)
//隐式转换将整数3转换成了一个Fraction对象。这个对象又被乘以Fraction(4, 5)


利用隐式转换丰富现有类库的功能

class RichFile(val from: File) {
    def read = Source.fromFile(from.getPath).mkString
}

implicit def file2RichFile(from: File) = new RichFile(name)
//这样你就可以在File对象上调用read方法了。


引用隐式转换

Scala会考虑如下的隐式转换函数:

1. 位于源或目标类型的伴生对象中的隐式函数。

2. 位于当前作用域可以以单个标识符指代的隐式函数。

import com.lianle.impatient.FractionConversions._


隐式转换规范

三种情况会考虑:

1. 当表达式的类型与预期的类型不同时;

2. 当对象访问一个不存在的成员时;

3. 当对象调用某个方法,而该方法的参数声明与传入参数不匹配时。

三种情况编译器不会考虑:

1. 如果代码能够在不使用隐式转换的前提下通过编译;

2. 编译器不会尝试同时执行多个转换;

3. 存在二义性的转换是个错误。



隐式参数

case class Delimiters(left: String, right: String)
def quote(what: String)(implicit delime: Delimiters) =
    delims.left + what + delims.right

调用:

quote("Bonjour le monds")(Delimiters("<<",">>"))
//将返回<<Bonjour le monds>>

也可以略去隐式参数列表,得到相同效果:

quote("Bonjour le monds")


利用隐式参数进行隐式转换

def smaller[T] (a: T, b: T)(implicit order: T => Ordered[T]) = if (order(a) < b) a else b


上下文界定

类型参数可以有一个形式为T:M的上下文界定。其中M是另一个泛型类型,它要求作用域中存在一个类型为M[T]的隐式值。

class Pair[T: Ordering]


@implicitNotFount注解

@implicitNotFount注解告诉编译器在不能够在出带有该注解的类型的参数时给出错误提示。

@implicitNotFount(msg = "Cannot prove that ${From} <:<${To}.")
abstract class <:<[-From, + To] extends Funcion1[From, To]

例如:

firstLast[String, Lig[Int]](List(1, 2, 3))
//将提示:
//Cannot prove that List[Int] <:<Iterable[String].


CanBuildFrom解读

CanBuidFrom[From, E, To]特质将提供类型证明,可以创建一个类型为To的集合,握有类型为E的值,并且和类型From兼容。

CanBuidFrom特质带有一个apply方法,产生类型为Builder[E, To]的对象。

Builder类型带有一个+= 方法用来将元素添加到一个内部的缓冲,还有一个result方法用来产出所要求的集合。

trait Builder[-E, +To] {
    def +=(e: E) : Unit
    def result(): To
}

trait CanBuidFrom[-From, -E, +To] {
    def apply(): Builder[E, To]
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 00:13:47

跟连乐一起学Scala-隐式转换的相关文章

第5课:彻底精通Scala隐式转换和并发编程及Spark源码阅读

隐式转换函数implicit def function例如implicit def rddToPairRDDFunctions[K, V](rdd: RDD[(K, V)]) scala> class Person(val name: String)defined class Person scala> class Enginner(val name: String, val salary: Double) { | def code = println(name + " Coding

Scala隐式转换

概述 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.本文原文出处: http://blog.csdn.net/bluishglc/article/details/50866314 严禁任何形式的转载,否则将委托CSDN官方维护权益! 隐式转换有四种常见的使用场景: 将某一类型转换成预期类型 类型增强与扩展 模拟新的语法 类型类 语法 隐式转换有新旧两种定义方法,旧的定义方法指是的"impli

大数据学习:Scala隐式转换和并发编程(DT大数据梦工厂)

很多Spark代码中使用了隐式转换.隐式参数.隐式类.隐式对象 如果不掌握,基本在读写复杂代码的时候读不懂 并发编程,怎么样进行高效并发,相互之间怎么通信,Spark这种分布式并发肯定非常重要 (Actor.Akka) ==========隐式转换函数============ 可以手动指定将某种类型的对象转换成其它类型的对象或者类 转换原因:假设制定好接口 比如File,我们想要File.dtSpark的方法,在JAVA中不行 如果在Scala里面我们可以进行升级,将File编程其它类型,就用之

Scala隐式转换类遇到的问题

今天练习Scala的隐式转换类遇到的一个问题,测试代码如下: object ImplcitTest { def main(args: Array[String]) { import Context._ val person1 = User("zhangsan") println(person1.getStr()) val filePath = Thread.currentThread.getContextClassLoader.getResource("test.txt&qu

scala 隐式转换

隐式转换第一例

记录: 一次解决整型溢出攻击(使用scala,隐式转换)

最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议购买该物品 306783379 个 于是服务器收到请求进行以下处理 val num = message.getInt("num") //获得客户端发送来的 306783379 val cost = num * produc.price  //这里没有校验物品的数量就直接计算总价了. 所以总

Scala 系列(十三)—— 隐式转换和隐式参数

一.隐式转换 1.1 使用隐式转换 隐式转换指的是以implicit关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能.示例如下: // 普通人 class Person(val name: String) // 雷神 class Thor(val name: String) { // 正常情况下只有雷神才能举起雷神之锤 def hammer(): Unit = { println(name + "举起雷神之锤") } } object T

转载:深入理解Scala的隐式转换系统

摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1.将方法或变量标记为implicit 2.将方法的参数列表标记为implicit 3.将类标记为implicit Scala支持两种形式的隐式转换: 隐式值:用于给方法提供参数 隐式视图:用于类型间转换或使针对某类型的方法能调用成功 隐式值: 例1:声明person方法.其参数为name,类型String

scala学习笔记-隐式转换与隐式参数(18)

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能,可以实现非常强大,而且特殊的功能. Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function.定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用.Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转

scala 高级十八 scala隐式方法,隐式参数的实现和使用

摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1.将方法或变量标记为implicit 2.将方法的参数列表标记为implicit 3.将类标记为implicit 隐式方法: package smart.iot import java.io.File import scala.io.Source class concealFunc(f:File) { d