Scala 隐式转换

本文深入探讨了Scala中的隐式转换概念,包括隐式方法、参数、类和对象的使用,通过实例展示了如何利用隐式转换提升代码的简洁性和可读性。

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

隐式方法

隐式转换必须有 implicit 关键字,命名习惯为:源方法 2 目标方法,二者的参数类型需要保持一致。

import java.io.File

import scala.io.Source

/**
  * Created by Administrator on 2018/10/8 16:08 in Beijing.
  */

class AdvanceFile(val file: File) {
  def read = Source.fromFile(file).mkString("")
}

object ImplicitTest {
  //隐式方法
  implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)

  def main(args: Array[String]) {
    println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)
  }
}

输出如下

Scala 隐式转换几年前就玩过了
Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明

Process finished with exit code 0

隐式参数

在参数前添加 implicit 关键字的参数。

import java.io.File

import scala.io.Source

/**
  * Created by Administrator on 2018/10/8 16:08 in Beijing.
  */

class AdvanceFile(val file: File) {
  def read = Source.fromFile(file).mkString("")
}

object ImplicitTest {
  //隐式方法
  implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)

  //隐式参数
  implicit val default : String = "Java"

  //函数的柯里化Currying
  def curryString(frameWork: String)(implicit language:String)  = {
    frameWork + " based on " + language
  }

  def main(args: Array[String]) {
    //println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)

    println(curryString("Spark")("Scala"))
    println(curryString("Kafka")("Scala"))
    println(curryString("Hadoop"))  //注意这个
  }
}

输出如下

Spark based on Scala
Kafka based on Scala
Hadoop based on Java

Process finished with exit code 0

隐式类

下面,通过 隐式类 来实现上述 隐式方法 一样的功能。

package programming_In_Scala

import java.io.File

import scala.io.Source

/**
  * Created by Administrator on 2018/10/8 16:08 in Beijing.
  */

/*class AdvanceFile(val file: File) {
  def read = Source.fromFile(file).mkString("")
}*/

object ImplicitTest {
  //隐式方法
  //implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)

  //隐式参数
  implicit val default : String = "Java"

  //函数的柯里化Currying
  def curryString(frameWork: String)(implicit language:String)  = {
    frameWork + " based on " + language
  }

  //隐式类
  implicit class FileAdvance(val file: File) {
    def read = Source.fromFile(file).mkString("")
  }

  def main(args: Array[String]) {
    println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)
  }
}

输出如下

Scala 隐式转换几年前就玩过了
Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明

Process finished with exit code 0

方法 在调用时,会检测 当前 有没有 直接方法 可以调用。如果没有,则去查找当前的类下的引式类,找到隐式类中与当前参数匹配的方法,找到对应的方法进行调用。如果都没有找到,则编译失败。

隐式对象

import java.io.File

import scala.io.Source

/**
  * Created by Administrator on 2018/10/8 16:08 in Beijing.
  */

/*class AdvanceFile(val file: File) {
  def read = Source.fromFile(file).mkString("")
}*/

// 抽象类:Template[T],具有泛型T
abstract class Template[T] {
  // 定义add方法,参数:泛型x:T, y:T 并且返回T对象
  def add(x: T, y: T): T

  // 定义抽象方法,返回T对象
  def none: T
}

object ImplicitTest {
  //隐式方法
  //implicit def file2AdvanceFile(file: File) = new AdvanceFile(file)

  //隐式参数
  implicit val default : String = "Java"

  //函数的柯里化Currying
  def curryString(frameWork: String)(implicit language:String)  = {
    frameWork + " based on " + language
  }

  //隐式类
  implicit class FileAdvance(val file: File) {
    def read = Source.fromFile(file).mkString("")
  }

  //隐式对象
  implicit object AddInt extends Template[Int] {
    override def add(x: Int, y: Int): Int = x + y

    override def none: Int = 0
  }

  //隐式对象
  implicit object AddString extends Template[String] {
    override def add(x: String, y: String): String = x + "_" + y

    override def none: String = ""
  }

  // Template[T] 根据传入参数T的类型 调用对应的隐式对象
  def sum[T](list: List[T])(implicit template: Template[T]): T = {
    if (list.isEmpty) {
      template.none
    }else {
      template.add(list.head, sum(list.tail))
    }
  }

  def main(args: Array[String]) {
    //println(new File("F:\\ChineseAcademyOfSciences\\test.txt").read)

    //println(curryString("Spark")("Scala"))
    //println(curryString("Kafka")("Scala"))
    //println(curryString("Hadoop"))  //注意这个

    println(sum(list = List(1, 2, 3, 4, 5)))
    println(sum(list = List("C", "Java", "Scala", "Python", "Go")))
  }
}

输出如下

15
C_Java_Scala_Python_Go_

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值