Scala 隐式转换 重要一点 什么是隐式转换以及隐式转换带来的好处

本文介绍了Scala中的隐式转换概念,通过具体实例演示了如何利用隐式转换来增强类的功能,以及如何在函数中使用隐式参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scala 隐式转换 重要一点 什么事隐式转换


package com.xing.listfile

/**
  * Created by DengNi on 2017/2/12.
  * 简要说明 implicit 是什么 ? 就是从一个类的对象调用另外一个类方法
  */
//Method 1 OptimusPrime can not call AutoBots 's function BlowFire
// 增加 OptimusPrime object 对象 实现隐式转换
class OptimusPrime(val function :String)  //此处 val 是必须的 ,不然找不到 optimusPrime.function
/**
object OptimusPrime{
  implicit def optimusPrime2AutoBots(optimusPrime:OptimusPrime) = new AutoBots(optimusPrime.function)
}
**/
class AutoBots(function : String){
  def blowFire = println(function + ": I can blow fire to fire you!!!")
}
//Method 2 定义一个不同类名字的 object  对象  ,zai  main 方法里面引用这个 对象
object implictis {
  implicit def optimusPrime2AutoBots(optimusPrime:OptimusPrime) = new AutoBots(optimusPrime.function)
}

object HelloImplicit {

  def main(args: Array[String]) {
    import implictis._
    val op = new OptimusPrime("OptimusPrime")
    println(op.blowFire)

    //多参数
   // talk("p1") 只传一个参数 指定是错的了
    talk("p1")("p22")

    // 但是我们就只想传一个 呢??
    implicit val name2 ="eat you"  //此处也引用了 隐式转换
    talk2("p3")


  }
  // 定义一个函数 有两个参数
  def talk(name1 : String)(name2:String) = println("thera are 2 param")
  def talk2(name1 : String)(implicit name2:String) = println("thera are 2 param " +name2) // 此处 implicit 必须加
}
/**
"C:\Program Files\Java\jdk1.7.0_80\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_80\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_80\jre\lib\rt.jar;D:\bigdataworkspaces\kafSpSt\out\production\kafSpSt;F:\scala\lib\scala-actors-migration.jar;F:\scala\lib\scala-actors.jar;F:\scala\lib\scala-library.jar;F:\scala\lib\scala-reflect.jar;F:\scala\lib\scala-swing.jar;D:\bigdataworkspaces\kafSpSt\lib\fastjson-1.2.11.jar;D:\bigdataworkspaces\kafSpSt\lib\fastutil-7.0.11.jar;D:\bigdataworkspaces\kafSpSt\lib\kafka_2.10-0.8.2.1.jar;D:\bigdataworkspaces\kafSpSt\lib\mysql-connector-java-5.1.6.jar;D:\bigdataworkspaces\kafSpSt\lib\mysql-connector-java-5.1.8-bin.jar;D:\bigdataworkspaces\kafSpSt\lib\spark-assembly-1.6.0-hadoop2.6.0.jar;D:\bigdataworkspaces\kafSpSt\lib\spark-examples-1.6.0-hadoop2.6.0.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.xing.listfile.HelloImplicit
OptimusPrime: I can blow fire to fire you!!!
()
thera are 2 param
thera are 2 param eat you

Process finished with exit code 0
 **/


### Scala 转换机制及其应用 在 Scala 中,转换是一种强大的特性,允许编译器自动将一种类型的对象转换为另一种类型。这种功能通过 `implicit` 关键字来实现。 #### 定义转换函数 转换可以通过定义带有 `implicit` 关键字的方法来完成。当遇到无法匹配参数类型的调用时,编译器会尝试查找适用的转换方法并应用它[^1]。 ```scala // 定义一个简单的转换函数 implicit def intToString(x: Int): String = x.toString ``` 上述代码定义了一个从 `Int` 到 `String` 的转换,在需要字符串的地方可以无缝使用整数变量而无需显的 `.toString()` 转换操作。 #### 使用上下文中的值 除了定义转换规则外,还可以利用已导入的作用域内的值来进行更复杂的逻辑处理或提供默认参数设置[^2]。 ```scala object MathUtil { implicit val defaultPrecision: Double = 0.0001 def approxEquals(a: Double, b: Double)(implicit precision: Double): Boolean = math.abs(a - b) <= precision } ``` 在这个例子中,如果未指定精度,则采用预设好的值作为比较的标准误差范围。 #### 应用于库设计模 Lift Web Framework 就很好地运用了这一概念,比如其 CSS 绑定机制就依赖于视图绑定支持动态页面元素更新而不必每次都手动传递模板片段[^3]。 ```scala class MySnippet { def render = "#someElement *" #> "Hello world" } ``` 这里展示了如何借助 CSS 选择器语法简化 HTML 片段替换过程,并且背后依靠的就是框架内部定义的一系列转换规则使得开发者能够写出更加直观简洁的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值