我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScala的隐式转换详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScala的隐式转换详解

隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型。

一、隐式值与隐式参数

隐式值是指在定义参数时前面加上implicit。隐式参数是指在定义方法时,方法中的部分参数是由implicit修饰【必须使用柯里化的方式,将隐式参数写在后面的括号中】。隐式转换作用就是:当调用方法时,不必手动传入方法中的隐式参数,Scala会自动在作用域范围内寻找隐式值自动传入。

隐式值和隐式参数需要注意以下几点:
1.同类型的参数的隐式值只能在作用域内出现一次,同一个作用域内不能定义多个类型一样的隐式值。

2.implicit关键字必须放在隐式参数定义的开头

3.一个方法只有一个参数是隐式转换参数时,那么可以直接定义implicit关键字修饰的参数,调用时直接创建类型不传入参数即可。

4.一个方法如果有多个参数,要实现部分参数的隐式转换,必须使用柯里化这种方式,隐式关键字出现在后面,只能出现一次

package com.bjsxt.scala
 
 
object ImplicitValue {
  
 
    //   * 4.一个方法如果有多个参数,要实现部分参数的隐式转换,
    //   必须使用柯里化这种方式,隐式关键字出现在后面,只能出现一次
  def Student(age:Int)(implicit name:String,i:Int) = {
    println(s"student = $name,age = $age,score = $i")
  }
  
  //   * 3.一个方法只有一个参数是隐式转换参数时,那么可以直接定义implicit关键字修饰的参数,
  //   调用时直接创建类型不传入参数即可。
  def Teacher(implicit name:String) = {
    println(s"teacher name is =$name")
  }
  def main(args: Array[String]): Unit = {
    //   * 1.同类型的参数的隐式值只能在作用域内出现一次,
    //   同一个作用域内不能定义多个类型一样的隐式值。比如这里的String、Int类型,各自只能定义一个
    implicit val name:String = "zhangsan"
    implicit val i:Int = 100
 
    //这里使用了隐式参数,只用传入age那个参数,后面两个参数可以不填,默认使用隐式值
    Student(100)
    //这里是直接使用了隐式值,可以不填参数,当然也可以给定参数,给定参数的话就是取给的参数的值
    Teacher
  }
}

输出的结果:会自动寻找对应的函数,并且进行隐式转换。

student = zhangsan,age = 100,score = 100
teacher name is =zhangsan

二、隐式转换函数

隐式转换函数是使用关键字implicit修饰的方法。当Scala运行时,假设如果A类型变量调用了method()这个方法,发现A类型的变量没有method()方法,而B类型有此method()方法,会在作用域中寻找有没有隐式转换函数将A类型转换成B类型,如果有隐式转换函数,那么A类型就可以调用method()这个方法。

隐式转换函数注意:隐式转换函数只与函数的参数类型和返回类型有关,与函数名称无关,所以作用域内不能有相同的参数类型和返回类型的不同名称隐式转换函数。

package com.bjsxt.scala
 
class Animal(name:String){
  def canFly()= {
    println(s"$name can fly....")
  }
}
 
class Rabbit(xname:String){
  val name = xname
}
 
object ImplicitValue2 {
  
  //定义隐式转换函数
  implicit def RabbitToAnimal(r:Rabbit):Animal = {
    new Animal(r.name)
  }
  //注意隐式转换函数只与参数类型和返回值类型有关,
  // 与函数名无关,所以不能定义两个相同类型的函数,虽然函数名不同,下面这个就是非法的
//  implicit def Rabbit(r:Rabbit):Animal = {
//    new Animal(r.name)
//  }
 
  def main(args: Array[String]): Unit = {
    val rabbit = new Rabbit("rabbit")
    //这里rabbit调用不了canFly,因为Rabbit类中没有canFly方法,
    // 但定义了隐式转换函数,那就会往Animal类中找
    rabbit.canFly()
  }
}

运行结果:

rabbit can fly....

三、隐式类

使用implicit关键字修饰的类就是隐式类。若一个变量A没有某些方法或者某些变量时,而这个变量A可以调用某些方法或者某些变量时,可以定义一个隐式类,隐式类中定义这些方法或者变量,隐式类中传入A即可。

隐式类注意:

1.隐式类必须定义在类,包对象,伴生对象中

2.隐式类的构造必须只有一个参数,同一个类,包对象,伴生对象中不能出现同类型构造的隐式类。

package com.bjsxt.scala
//隐式类
 
class Rabbit1(xname:String){
  val name = xname
}
 
object ImplicitValue3 {
 
  //定义隐式类,只能在object中定义,并且只能传入一个参数
  //不能出现同类型构造的隐式类。(同类型:参数类型和返回值类型,与类名无关)
  implicit class Animal1(r:Rabbit1){
    def showName() = {
      println(s"${r.name} is Rabbit....")//对象.属性需要加“{}”
    }
  }
 
  def main(args: Array[String]): Unit = {
    val rabbit = new Rabbit1("RABBIT")
//    Rabbit1类中没有showName方法,这是会找隐式类
    rabbit.showName()
  }
 
}

运行结果:

RABBIT is Rabbit....

到此这篇关于Java Scala的隐式转换详解的文章就介绍到这了,更多相关Scala隐式转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScala的隐式转换详解

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

下载Word文档

猜你喜欢

JavaScala的隐式转换详解

隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型。本文通过代码示例介绍了Scala的隐式转换,感兴趣的小伙伴可以参考阅读
2023-05-17

JavaScala之模式匹配与隐式转换

在Java中我们有switchcasedefault这三个组成的基础语法,在Scala中我们是有match和case组成default的作用由case代替,本文详细介绍了Scala的模式匹配与隐式转换,感兴趣的可以参考本文
2023-05-18

Scala隐式转换和隐式参数详解

Scala隐式转换和隐式参数是两个非常强大的功能,它们可以让我们编写更灵活和优雅的代码,但也需要注意一些潜在的问题和风险,这篇文章主要介绍了Scala隐式转换和隐式参数,需要的朋友可以参考下
2023-05-14

c++类的隐式转换与强制转换重载详解

转换函数的名称是类型转换的目标类型,因此,不必再为它指定返回值类型;转换函数是被用于本类型的数值或变量转换为其他的类型,也不必带参数
2022-11-15

JavaScript隐式类型转换规则详解

这篇文章主要为大家介绍了JavaScript隐式类型转换规则详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
2023-05-18

Oracle 隐式转换

Oracle在执行自隐式转换时:总是会把字符串转为数字,字符串转为日期。当列进行转换,会跳过索引,降低性能。创建一个表格,给三个列建立索引,进行测试。create table t1(n1 number, v1 varchar2(10), d1 date);in
Oracle 隐式转换
2016-06-28

详解C#如何实现隐式类型转换

Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNext 库。在本文中,我们将通过例子回顾 C# 中 using 语句和隐式类型转换的使用,感兴趣的可以了解一下
2023-01-05

Javascala模式匹配机制详解

模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断
2023-02-01

PHP中的隐式转换机制解析

PHP中的隐式转换机制解析在PHP编程中,隐式转换是指在不显式指定类型转换的情况下,PHP自动将一个数据类型转换为另一个数据类型的过程。隐式转换机制在编程中非常常见,但也容易造成一些意想不到的bug,因此了解隐式转换机制的原理和规则对于编
PHP中的隐式转换机制解析
2024-03-09

详解隐秘的 MySQL 类型转换问题详解

这篇文章主要为大家介绍了详解隐秘的 MySQL 类型转换问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

ORACLE隐式类型转换

隐式类型转换简介   通常ORACLE数据库存在显式类型转换(Explicit Datatype Conversion)和隐式类型转换(Implicit Datatype Conversion)两种类型转换方式。如果进行比较或运算的两个值的数据类型不同时(源数
ORACLE隐式类型转换
2020-03-25

了解隐式类型转换的方式有哪些?

你知道隐式类型转换的几种方式吗?在编程中,类型转换是将一个数据类型转换为另一个数据类型的常见操作。类型转换可以是显式的,即通过代码指定要转换的数据类型,也可以是隐式的,即根据上下文自动进行数据类型转换。隐式类型转换在一些编程语言中是非常
了解隐式类型转换的方式有哪些?
2024-01-15

一文详解JS 类型转换方法以及如何避免隐式转换

这篇文章主要为大家介绍了JS 类型转换方法以及如何避免隐式转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

谈谈MySQL中的隐式转换

工作过程中会遇到比较多关于隐式转换的案例,隐式转换除了会导致慢查询,还会导致数据不准。本文通过几个生产中遇到的案例来。 基础知识 关于比较运算的原则,MySQL官方文档的描述: https://dev.mysql.com/doc/refma
2022-05-25

PHP类型的隐式转换:理解与应用

PHP是一种广泛应用的服务器端脚本语言,具有强大的功能和灵活性,但在处理数据类型转换时,很多初学者可能会遇到一些困惑。本文将要讨论的是PHP中的类型隐式转换,以及如何理解和应用这种特性。在PHP中,类型隐式转换指的是自动将一个数据类型转换
PHP类型的隐式转换:理解与应用
2024-03-08

PHP的强制类型转换与隐式转换比较

PHP的强制类型转换与隐式转换比较在PHP中,类型转换是一个重要的主题,它涉及到如何处理不同数据类型之间的交互。PHP提供了两种类型转换方式:强制类型转换和隐式类型转换。在本文中,我们将通过具体的代码示例来比较这两种类型转换方式的异同。
PHP的强制类型转换与隐式转换比较
2024-03-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录