首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

scala 隐式详解(implicit关键字)

掌握implicit的用法是阅读Spark源码的基础,也是学习Scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,...当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。...这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义 例子: scala> val i: Int = 3.5 //直接报错 加上这句: scala...> implicit def double2Int(d: Double) = d.toInt 再运行,没报错 scala> val i: Int = 3.5 //i=3 3.隐式调用函数 隐式调用函数可以转换调用方法的对象...._ val rabbit = new AminalType rabbit.wantLearned("breaststroke") //蛙泳 } 上例中编译器在rabbit对象调用时发现对象上并没有

1.4K90

scala(4):implicit关键字

掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把最后一个参数列表标记为...当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。...这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义 例子: scala> val i: Int = 3.5 //直接报错 加上这句: scala...隐式调用函数可以转换调用方法的对象,比如但编译器看到X .method,而类型 X 没有定义 method(包括基类)方法,那么编译器就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型...._ val rabbit = new AminalType rabbit.wantLearned("breaststroke") //蛙泳 } 123456789101112 上例中编译器在rabbit

39120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Scalar_scala yield

    掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把最后一个参数列表标记为...当调用包含隐式参数的方法是,如果当前上下文中有合适的隐式值,则编译器会自动为改组参数填充合适的值。如果没有编译器会抛出异常。当然,标记为隐式参数的我们也可以手动为该参数添加默认值。...这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义 例子: scala> val i: Int = 3.5 //直接报错 加上这句: scala...隐式调用函数可以转换调用方法的对象,比如但编译器看到X .method,而类型 X 没有定义 method(包括基类)方法,那么编译器就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型...= new AminalType rabbit.wantLearned("breaststroke") //蛙泳 } 1 2 3 4 5 6 7 8 9 10 11 12 上例中编译器在

    43020

    挑逗 Java 程序员的那些 Scala 绝技

    在创建实例时,我们也可以命名参数(named parameter)语法改变默认值。 ? 在实际开发中,一个模型类或值对象可能拥有很多属性,其实很多属性都可以设置一个合理的默认值。...利用默认值和命名参数,我们可以非常方便地创建模型类和值对象的实例。所以在 Scala 中基本上不需要使用工厂模式或构造器模式创建对象,如果对象的创建过程确实非常复杂,则可以放在伴生对象中创建,如下。...九、隐式参数和隐式转换 挑逗指数: 五星 隐式参数 如果每当要执行异步任务时,都需要显式传入线程池参数,你会不会觉得很烦?Scala 通过隐式参数为你解除这个烦恼。...隐式转换 隐式转换相比较于隐式参数,使用起来更来灵活。...在 Scala 中,为了实现上面的运算,我们只需要实现一个简单的隐式转换就可以了。 ? 更好的运行时性能 在日常开发中,我们通常需要将值对象转换成 Json 格式以方便数据传输。

    1K20

    不可不会的scala隐式转换

    一,简介 从类型S到类型T的隐式转换由具有函数类型S => T的隐式值定义,或者通过可转换为该类型的值的隐式方法来定义。...scala.Predef声明了一些预定义的类型(例如Pair)和方法(例如,assert),还有一些隐式转换。...test 对象的时候并没有show方法,此时编译器就会在作用域范围内查找能使其编译通过的隐式视图,找到RDD2DF的隐式转换方法后,会先进行隐式转换,之后调用show方法。...3,隐式转化参数 在定义一个方法时可以把最后一个参数列表定义为隐式参数。这个在spark内部使用也是非常广泛,比如前面发表的文章spark累加器原理,自定义累加器及陷阱就用到了。...当然,标记为隐式参数的我们也可以手动为该参数添加默认值。 def foo(n: Int)(implicit t1: String, t2: Double = 3.14)。 少了第一步会报错。 ?

    72610

    挑逗 Java 程序员的那些 Scala 绝技

    来源:http://t.cn/E2Fz6HW 类型推断 字符串增强 集合操作 优雅的值对象 模式匹配 并发编程 声明式编程 面向表达式编程 隐式参数和隐式转换 小结 ---- 有个问题一直困扰着 Scala...简洁的实例化方式 我们为 role 和 addTime 两个属性定义了默认值,所以我们可以只使用 name 创建一个 User 实例: val u = User("jack") 在创建实例时,我们也可以命名参数...(named parameter)语法改变默认值: val u = User("jack", role = "admin") 在实际开发中,一个模型类或值对象可能拥有很多属性,其实很多属性都可以设置一个合理的默认值...利用默认值和命名参数,我们可以非常方便地创建模型类和值对象的实例。...Scala 通过隐式参数为你解除这个烦恼。

    1.5K60

    Scala 高阶(十一):隐式转换和泛型

    self) n else self } 隐式参数 普通方法或者函数中的参数可以通过 implicit 关键字声明为隐式参数,调用该方法时,就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。...在 Scala2.10 后提供了隐式类,可以使用 implicit 声明类,隐式类的非常强大,同样可以扩展类的功能,在集合中隐式类会发挥重要的作用。...说明: 隐式类所带的构造参数有且只能有一个 隐式类必须被定义在“类”或“伴生对象”或“包对象”里,即隐式类不能是顶级的。...如果第一条规查找隐式对象失败,会继续在隐式参数的类型的作用域中查找。 类型的作用域是指该类型相关联的全部伴生对象以及该类型所在包的包对象。...用于多个函数需要同一个默认参数时,就不用每个函数定义时都写一次默认值了。 二、泛型 [TypeList],定义和使用都是。 常用于集合类型中用于支持不同元素类型。

    59510

    Scala语法基础之隐式转换

    一,简介 从类型S到类型T的隐式转换由具有函数类型S => T的隐式值定义,或者通过可转换为该类型的值的隐式方法来定义。...scala.Predef声明了一些预定义的类型(例如Pair)和方法(例如,assert),还有一些隐式转换。...test 对象的时候并没有show方法,此时编译器就会在作用域范围内查找能使其编译通过的隐式视图,找到RDD2DF的隐式转换方法后,会先进行隐式转换,之后调用show方法。...3,隐式转化参数 在定义一个方法时可以把最后一个参数列表定义为隐式参数。这个在spark内部使用也是非常广泛,比如前面发表的文章定义累加器>就用到了。...当然,标记为隐式参数的我们也可以手动为该参数添加默认值。def foo(n: Int)(implicit t1: String, t2: Double = 3.14)。 少了第一步会报错。 ?

    1.2K90

    Scala学习笔记

    中返回多个参数,需要将参数放到一个集合或者写个model实体类,返回该实体对象,但是在scala中可以放到元组中非常方便             #map中存放很多的对偶元组             ...* 在scala中,主构造器是与类名放在一起的,有且只有一个,java可以写多个构造方法,多个构造方法间实现重载             * 在类中,没有定义在任何方法中的代码(包括成员字段),都属于主构造器的代码...的高级内容:泛型     (*)泛型类         泛型类(类声明时类名后面括号中即为类型参数),顾名思义,其实就是在类的声明中,定义一些泛型类型,然后在类内部,比如field、method,就可以使用这些泛型类型...:(泛型变量的值可以是本身或者其父类的类型)在类或者特征的定义中,在类型参数之前加上一个-符号,就可以定义逆变泛型类和特征了                 参考ContravanceDemo代码...    (*)隐式参数         核心:隐式转换             参考ImplicitParam代码     (*)隐式类             在类前面加个implicit关键字

    2.6K40

    Scala——多范式, 可伸缩, 类似Java的编程语言

    二 变量常量声明 三 类和对象使用 四 条件语句 第四章 Scala 的方法与函数 一 函数方法的定义 二 递归方法 三 参数有默认值的方法 四 可变参数的方法 五 匿名函数 六 嵌套函数/方法 七...隐式值与隐式参数 隐式值是指在定义参数时前面加上implicit。隐式参数是指在定义方法时,方法中的部分参数是由implicit修饰【必须使用柯里化的方式,将隐式参数写在后面的括号中】。...隐式转换作用就是:当调用方法时,不必手动传入方法中的隐式参数,Scala会自动在作用域范围内寻找隐式值自动传入。...隐式类注意: .隐式类必须定义在类,包对象,伴生对象中。 隐式类的构造必须只有一个参数,同一个类,包对象,伴生对象中不能出现同类型构造的隐式类。...参数类型 和 返回类型 的不同名称的隐式转换函数 * 3.隐式类 * 在类的前面加上关键字implicit, 必须定义在object和class中 * 隐式类中的所有属性方法都可以被调用

    3K20

    大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

    ()   }   def hello(): Unit = { // 底层 hello() 函数名     println("***")   } } 9.3.3 一个案例说明 隐式值、隐式参数默认值...小结: (1)在隐式值匹配时,不能有二义性。 (2)当同时有隐式值和隐式参数的默认值的时候,隐式值的优先级高。 (3)当隐式参数默认值匹配不到隐式值时,如果有隐式参数默认值的话,会使用默认值。...如果没有隐式参数默认值的话,会运行报错。 9.4 隐式类 9.4.1 基本介绍 ?...9.5 隐式的转换时机 1、当方法中的参数的类型与目标类型不一致时,会发生隐式转换。...2、当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型)。 3、即:当对象调用所在类中存在的方法或成员时,编译器不会将对象进行隐式转换。

    1.4K20

    scala的隐式转换学习总结(详细)

    1,隐式类:通过在类名前使用 implicit 关键字定义 1)格式: implicit class 类名(参数){ //类主体 } 例子:string中没有...[Multiplicable[T]] //根据具体的类型调用相应的隐式对象中的方法 ev.multiply(x) } //调用隐式对象 MultiplicableInt 中的方法...三,隐式参数与隐式值 1, 隐式参数,在函数的定义时,在参数前添加implicit关键字。...7)implicit 关键字在隐式参数中只能出现一次,柯里化的函数也不例外!...> 四,隐式函数的若干规则: 1)显示定义规则 在使用带有隐式参数的函数时,如果没有明确指定与参数类型匹配相同的隐式值,编译器不会通过额外的隐式转换来确定函数的要求

    73520

    scala快速入门系列【隐式转换和隐式参数】

    Scala会根据隐式转换方法的签名,在程序中使用到隐式转换方法接收的参数类型定义的对象时,会自动将其传入隐式转换方法,转换为另外一种类型的对象并返回。这就是“隐式转换”。...隐式转换的方法在当前范围内才有效。如果隐式转换不在当前范围内定义(比如定义在另一个类中或包含在某个对象中),那么必须通过import语句将其导。...隐式参数 所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的参数,即隐式值,并注入参数。...Scala会在两个范围内查找: 当前作用域内可见的val或var定义的隐式变量; 一种是隐式参数类型的伴生对象内的隐式值; 隐式转换方法作用域与导入 (1)Scala默认会使用两种隐式转换,一种是源类型或者目标类型的伴生对象内的隐式转换方法...隐式转换的时机 (1)当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换.

    91430

    Spark基础-scala学习(八、隐式转换与隐式参数)

    大纲 隐式转换 使用隐式转换加强现有类型 导入隐式转换函数 隐式转换的发生时机 隐式参数 隐式转换 要实现隐式转换,只要程序可见的范围内定义隐式转换函数即可。Scala会自动使用隐式转换函数。...也就是说,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的方法时,由scala自动进行隐式转换为加强类,然后再调用该方法 案例:超人变身 scala> :paste /...隐式转换的发生时机 调用某个函数,但是给函数传入的参数的类型,与函数定义的接收参数类型不匹配(案例:特殊售票窗口) 使用某个类型的对象,调用某个方法,而这个方法并不在于该类型时(案例:超人变身) 使用某个类型的对象...(leo) res1: String = T-1 隐式参数 所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象...,即隐式值,并注入参数 Scala会在两个范围内查找:一种是当前作用域内可见的val或var定义的隐式变量;一种是隐式参数类型的伴生对象内的隐式值 案例:考试签到 scala> :paste // Entering

    1.3K20

    Scala 【 14 隐式转换与隐式参数 】

    隐式转换与隐式参数 ​ Scala 的隐式转换,其实最核心的就是定义隐式转换函数,即 implicit conversion function 。 ​...Scala 会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回。这就是“隐式转换”。 ​...也就是说,可以为某个类定义一个加强版的类,并定义互相之间的隐式转换,从而让源类在使用加强版的方法时,由Scala自动进行隐式转换为加强类,然后再调用该方法。...隐式参数 ​ 所谓的隐式参数,指的是在函数或者方法中,定义一个用 implicit 修饰的参数,此时 Scala 会尝试找到一个指定类型的,用 implicit 修饰的对象,即隐式值,并注入参数。 ​...Scala 会在两个范围内查找:一种是当前作用域内可见的 val 或 var 定义的隐式变量;一种是隐式参数类型的伴生对象内的隐式值。

    81420

    Scala语言入门:初学者的基础语法指南

    包对象可以解决在包级别共享常量、类型别名、隐式转换等问题。 在 Scala 中,可以使用 package 关键字定义一个包对象。包对象的文件名必须为 package.scala,并与包名一致。...在这个例子中,编译器找到了我们定义的 intToString 函数,并自动调用它将 1 转换为 "1"。 隐式参数:可以使用 implicit 关键字定义隐式参数,让编译器自动为方法提供参数值。...然后我们定义了一个方法 foo,它接受一个隐式参数 x。 在主程序中,我们调用了方法 foo,但没有显式地传入参数。由于方法 foo 接受一个隐式参数,因此编译器会尝试寻找一个隐式值来作为参数传入。...在这个例子中,编译器找到了我们定义的隐式值 x 并将其作为参数传入方法 foo。...在 Scala 中,可以为函数参数指定默认值。

    34220

    Scala之隐式转换「建议收藏」

    到PairRDDFunctions的隐式转换: 然后在SparkContext中import了RDD的所有东西,使隐式转换生效。...这个类型定义在包 Scala.Predef 对象中。 Scala.Predef 自动引入到当前作用域,在这个对象中,同时定义了一个从类型 Any 到 ArrowAssoc 的隐含转换。...如果第一种方式没有找到,则编译器会继续在隐式参数类型的隐式作用域里查找。 真正复杂的地方是什么叫一个类型的隐式作用域?一个类型的隐式作用域指的是“与该类型相关联的类型”的所有的伴生对象。...定义如下: 假如T是这样定义的:T with A with B with C,那么A, B, C的伴生对象都是T的搜索区域。 如果T是类型参数,那么参数类型和基础类型都是T的搜索部分。...隐含参数有点类似缺省参数,如果在调用方法时没有提供某个参数,编译器会在当前作用域查找是否有符合条件的 implicit 对象可以作为参数传入,不同于缺省参数,隐式参数的值可以在方法调用的前的上下文中指定

    82050

    Scala语言入门:初学者的基础语法指南

    包对象可以解决在包级别共享常量、类型别名、隐式转换等问题。 在 Scala 中,可以使用 package 关键字定义一个包对象。包对象的文件名必须为 package.scala,并与包名一致。...在这个例子中,编译器找到了我们定义的 intToString 函数,并自动调用它将 1 转换为 "1"。 隐式参数:可以使用 implicit 关键字定义隐式参数,让编译器自动为方法提供参数值。...然后我们定义了一个方法 foo,它接受一个隐式参数 x。 在主程序中,我们调用了方法 foo,但没有显式地传入参数。由于方法 foo 接受一个隐式参数,因此编译器会尝试寻找一个隐式值来作为参数传入。...在这个例子中,编译器找到了我们定义的隐式值 x 并将其作为参数传入方法 foo。...在 Scala 中,可以为函数参数指定默认值。

    36120

    scala 隐式转换

    中可以让函数库调用变得更加方便的隐式变换和隐式参数,以及如何通过它们来避免一些繁琐和显而易见的细节问题。...在 Scala 中,解决这个问题的途径是使用隐含类型变换和隐式参数。它们可以让函数库的调用变得更加方便,并避免一些繁琐和显而易见的细节问题。...Scala 的 implicit 可以有 implicit 类、方法和参数。 本项目课的几个实验将为你介绍 Scala 的隐式变换和隐式参数的用途。...Scala 在需要时会自动把整数转换成双精度实数,这是因为在 Scala.Predef 对象中定义了一个隐式转换: implicit def int2double(x:Int) :Double = x.toDouble...“单一标识符”规则有一个例外.编译器还将在源类型或转换的期望目标类的伴生对象中寻找隐式定义.

    1.1K30
    领券