iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Scala隐式转换和隐式参数的作用是什么
  • 208
分享到

Scala隐式转换和隐式参数的作用是什么

2023-06-02 08:06:46 208人浏览 独家记忆
摘要

这篇文章主要讲解了“Scala隐式转换和隐式参数的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala隐式转换和隐式参数的作用是什么”吧!5.1. 概念隐式转换和隐式

这篇文章主要讲解了“Scala隐式转换和隐式参数的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala隐式转换和隐式参数的作用是什么”吧!

5.1. 概念

隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。

5.2. 作用

隐式的对类的方法进行增强,丰富现有类库的功能

object ImplicitDemo extends App{
  //定义隐式类,可以把File转换成定义的隐式类RichFile
  implicit class RichFile(from:File){
    def read:String = Source.fromFile(from.getPath).mkString
  }
  //使用隐式类做已有类的动能的扩展
  val contents = new File("src/test1.txt").read
  println(contents)

}

5.5. 隐式类

创建隐式类时,只需要在对应的类前加上implicit关键字。比如:

object Helpers {
  implicit class IntWithTimes(x: Int) {
    def times[A](f: => A): Unit = {
      def loop(current: Int): Unit =
        if(current > 0) {
          f
          loop(current - 1)
        }
      loop(x)
    }
  }
}

这个例子创建了一个名为IntWithTimes的隐式类。这个类包含一个int值和一个名为times的方法。要使用这个类,只需将其导入作用域内并调用times方法。比如:

scala> import Helpers._
import Helpers._
scala> 5 times println("HI")
HI
HI
HI
HI
HI

使用隐式类时,类名必须在当前作用域内可见且无歧义,这一要求与隐式值等其他隐式类型转换方式类似。

只能在别的trait/类/对象内部定义。

    object Helpers {
       implicit class RichInt(x: Int) // 正确!
    }
    implicit class RichDouble(x: Double) // 错误!

构造函数只能携带一个非隐式参数。

 implicit class RichDate(date: java.util.Date) // 正确!
 implicit class Indexer[T](collecton: Seq[T], index: Int) // 错误!
 implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // 正确!

虽然我们可以创建带有多个非隐式参数的隐式类,但这些类无法用于隐式转换。

在同一作用域内,不能有任何方法、成员或对象与隐式类同名。

object Bar
implicit class Bar(x: Int) // 错误!

val x = 5
implicit class x(y: Int) // 错误!

implicit case class Baz(x: Int) // 错误!

5.6. 隐式转换函数

是指那种以implicit关键字声明的带有单个参数的函数,这种函数将被自动引用,将值从一种类型转换成另一种类型。

使用隐含转换将变量转换成预期的类型是编译器最先使用 implicit 的地方。这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义。

比如,通常情况下,双精度实数不能直接当整数使用,因为会损失精度:

scala> val i:Int = 3.5
<console>:7: error: type mismatch;
 found   : Double(3.5)
 required: Int
       val i:Int = 3.5
                   ^

当然你可以直接调用 3.5.toInt。

这里我们定义一个从 Double 到 Int 的隐含类型转换的定义,然后再把 3.5 赋值给整数,就不会报错。

scala> implicit def doubleToInt(x:Double) = x toInt
doubleToInt: (x: Double)Int
scala> val i:Int = 3.5
i: Int = 3

此时编译器看到一个浮点数 3.5,而当前赋值语句需要一个整数,此时按照一般情况,编译器会报错,但在报错之前,编译器会搜寻是否定义了从 Double 到 Int 的隐含类型转换,本例,它找到了一个 doubleToInt。 因此编译器将把

val i:Int = 3.5

转换成

val i:Int = doubleToInt(3.5)

这就是一个隐含转换的例子,但是从浮点数自动转换成整数并不是一个好的例子,因为会损失精度。 Scala 在需要时会自动把整数转换成双精度实数,这是因为在 Scala.Predef 对象中定义了一个

implicit def int2double(x:Int) :Double = x.toDouble

而 Scala.Predef 是自动引入到当前作用域的,因此编译器在需要时会自动把整数转换成 Double 类型。

5.7. 隐式参数

object Test{
    trait Adder[T] {
      def add(x:T,y:T):T
    }

    implicit val a = new Adder[Int] {
      override def add(x: Int, y: Int): Int = x+y
    }

    def addTest(x:Int,y:Int)(implicit adder: Adder[Int]) = {
      adder.add(x,y)
    }

   addTest(1,2)      // 正确, = 3
   addTest(1,2)(a)   // 正确, = 3
   addTest(1,2)(new Adder[Int] {
      override def add(x: Int, y: Int): Int = x-y
    })   // 同样正确, = -1
}

感谢各位的阅读,以上就是“Scala隐式转换和隐式参数的作用是什么”的内容了,经过本文的学习后,相信大家对Scala隐式转换和隐式参数的作用是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Scala隐式转换和隐式参数的作用是什么

本文链接: https://www.lsjlt.com/news/229580.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Scala隐式转换和隐式参数的作用是什么
    这篇文章主要讲解了“Scala隐式转换和隐式参数的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala隐式转换和隐式参数的作用是什么”吧!5.1. 概念隐式转换和隐式...
    99+
    2023-06-02
  • Scala隐式转换和隐式参数详解
    目录Scala隐式转换和隐式参数隐式转换隐式参数隐式类隐式转换和隐式参数的导入总结Scala隐式转换和隐式参数 隐式转换 隐式转换是指在Scala编译器进行类型匹配时,如果找不到合适...
    99+
    2023-05-14
    Scala隐式转换和隐式参数 Scala隐式转换 Scala隐式参数
  • Scala隐式转换和隐式参数怎么定义
    本篇内容介绍了“Scala隐式转换和隐式参数怎么定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Scala隐式转换和隐式参数隐式转换隐式转...
    99+
    2023-07-05
  • c语言隐式转换规则是什么
    C语言中的隐式转换规则包括以下几个方面:1. 整数提升:当操作数为int类型或short类型时,会自动转换为较大的类型(如int类型...
    99+
    2023-09-16
    c语言
  • PostgreSQL隐式类型转换中选择操作符的实现函数是什么
    这篇文章主要讲解了“PostgreSQL隐式类型转换中选择操作符的实现函数是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL隐式类型转...
    99+
    2022-10-18
  • Go语言不提供隐式数字转换的原因是什么
    这篇文章主要介绍“Go语言不提供隐式数字转换的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言不提供隐式数字转换的原因是什么”文章能帮助大家解决问题。什么是隐式转换在 C 语言中,隐...
    99+
    2023-07-05
  • C语言隐式类型转换与强制类型转换的方法是什么
    本篇内容主要讲解“C语言隐式类型转换与强制类型转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言隐式类型转换与强制类型转换的方法是什么”吧!类型转换数据有不同的类型,不同类型数...
    99+
    2023-06-25
  • PostgreSQL隐式类型转换中使用哪些操作符实现函数
    这篇文章主要讲解了“PostgreSQL隐式类型转换中使用哪些操作符实现函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL隐式类型转换中...
    99+
    2022-10-18
  • Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题
    背景 在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢。这个varchar字段有一个复合索引。其中的总条数有58989,甚...
    99+
    2022-05-17
    Mysql 5.6隐式转换导致的索引失效 Mysql 5.6隐式转换
  • Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法
    这篇文章主要介绍了Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了...
    99+
    2022-10-18
  • ABAP和XML数据格式互相转换的方法是什么
    这篇文章主要介绍“ABAP和XML数据格式互相转换的方法是什么”,在日常操作中,相信很多人在ABAP和XML数据格式互相转换的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ABAP和XML数据格式互...
    99+
    2023-06-04
  • Python转换数据类型函数和转换数据类型的作用是什么
    这篇文章给大家分享的是有关Python转换数据类型函数和转换数据类型的作用是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、转换数据类型的作用(必要性)先用一个问题来讲解一下为什么要学习转换数据类型?问题:...
    99+
    2023-06-29
  • 数据库中TO_CHAR格式转换的方法是什么
    本篇内容主要讲解“数据库中TO_CHAR格式转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库中TO_CHAR格式转换的方法是什么”吧!我的经...
    99+
    2022-10-18
  • Oracle数据库隐含参数使用的五个原则和四个建议分别是什么
    这期内容当中小编将会给大家带来有关Oracle数据库隐含参数使用的五个原则和四个建议分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。隐含参数是数据库参数名中前缀为...
    99+
    2022-10-19
  • MySQL获取时间、格式转换各类操作的方法是什么
    本篇内容介绍了“MySQL获取时间、格式转换各类操作的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2022-11-30
    mysql
  • Python函数值传递、引用传递、形式参数和实际参数的区别是什么
    本篇内容主要讲解“Python函数值传递、引用传递、形式参数和实际参数的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python函数值传递、引用传递、形式参数和实际参数的区别是什么”...
    99+
    2023-06-30
  • mongodb中oplog的格式和作用是什么
    这篇文章主要讲解了“mongodb中oplog的格式和作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mongodb中oplog的格式和作用是什么”吧!目录 基本概念 Oplog 的...
    99+
    2023-06-20
  • JavaScript代码中的函数参数和副作用是什么
    这篇文章给大家介绍JavaScript代码之函数参数和副作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。函数是JavaScript程序的重要组成部...
    99+
    2022-10-19
  • Windows安全模式的功能和作用是什么
    这篇文章主要讲解了“Windows安全模式的功能和作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Windows安全模式的功能和作用是什么”吧!什么是Windows的安全模式?安全模...
    99+
    2023-06-28
  • 机架式服务器的作用和用途是什么
    机架式服务器是一种专门设计的服务器,通常被安装在机架中,以节省空间和提高效率。其作用和用途包括:1. 数据中心:机架式服务器通常用于...
    99+
    2023-06-11
    机架式服务器 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作