样例类(case classes)

  • 概念理解

使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,它将帮你实现setter和getter方法。

  1. 样例类默认帮你实现了toString,equals,copy和hashCode等方法。
  2. 样例类可以new, 也可以不用new
  • 例子:结合模式匹配的代码
package com.henu.scala12caseclassesAndimplicitcase class Person(name:String,age:Int)object CaseClassScalaDemo {def main(args: Array[String]): Unit = {val p1 = new Person("George",22)val p2 = new Person("kk",age = 20)val p3 = new Person("honey",age = 18)println(p1)println(p3)println(p1)val list = List(p1,p2,p3)list.foreach(x =>{x match {case Person("George",22) => println("George")case Person("kk",20) => println("kk")case _=> println("no match")}})}
}

隐式转换

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

  • 隐式值与隐式参数

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

隐式值和隐式参数注意:

1). 同类型的参数的隐式值只能在作用域内出现一次,同一个作用域内不能定义多个类型一样的隐式值。

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

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

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

package com.henu.scala12caseclassesAndimplicitobject ImpliciScalaDemo {def Student(age:Int)(implicit name:String,i:Int)={println(s"student : $name , age = $age, score = $i")}def Teacher(implicit name:String): Unit ={println(s"teacher name is : $name")}def main(args: Array[String]): Unit = {implicit val dd = "george"implicit val ddd = 100Student(22)Teacher}
}
  • 隐式转换函数

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

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

package com.henu.scala12caseclassesAndimplicitobject ImpliciFunDemo {implicit def rabbitToAnimal(rabbit: Rabbit):Animal = {new Animal(rabbit.name)}def main(args: Array[String]): Unit = {val rabbit = new Rabbit("george")rabbit.canFly()}
}
class Animal(name:String){def canFly() ={println(s"$name can fly!")}
}
class Rabbit(xname:String){val name = xname
}
  • 隐式类

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

隐式类注意:

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

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

package com.henu.scala12caseclassesAndimplicitclass Rabbit(s:String){val name = s
}object ImplicitClass {implicit class Animal(rabbit: Rabbit){val tp = "Animal"def canFly() = {println(rabbit.name + " can fly...")}}def main(args: Array[String]): Unit = {val rabbit = new Rabbit("rabbit")rabbit.canFly()println(rabbit.tp)}
}

Scala _09样例类(case classes)隐式转换相关推荐

  1. scala 样例类(case class) + 模式匹配代码示例

    package com.zxl/*** @description:* @author: zhangxueliang* @create: 2021-04-28 16:54* @version: 1.0* ...

  2. Scala模式匹配--样例类--密封样例类--偏函数

    Scala模式匹配--样例类--密封样例类--偏函数 模式匹配 等价于java的switch caseval c = '+'c match{case '+' => println(111)cas ...

  3. C++拾趣——类构造函数的隐式转换

    之前看过一些批判C++的文章,大致意思是它包含了太多的"奇技淫巧",并不是一门好的语言.我对这个"奇技淫巧"的描述颇感兴趣,因为按照批判者的说法,C++的一些特 ...

  4. 【Scala】Scala中的模式匹配、类型参数与隐式转换

    1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...

  5. Scala入门到精通——第十八节 隐式转换与隐式参数(一)

    本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...

  6. JSP→基本语法/静态内容/指令/动作/表达式/小脚本(Scriptlet)/声明/注释、JSP页面声明周期、代码样例、九大隐式内置对象及方法代码样例

    JSP(全称JavaServer Pages)是一种动态网页技术标准. 指令 注释 小脚本 声明 表达式 JSP页面声明周期 九九乘法表样例 九大隐式内置对象 out get与post请求方式区别 r ...

  7. Scala样例类(case class)

    一.简介 case class是一种可以用来快速保存数据的类,可以认为是java中的pojo类,用于对象数据的保存.它自己已经帮助我们实现了以下方法 apply(所以不需要new) toString ...

  8. scala中的隐式转换、隐式参数和隐式类

    scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...

  9. 深入理解Scala的隐式转换系统

    原文链接:http://www.cnblogs.com/MOBIN/p/5351900.html ---------------------------------------------- 摘要: ...

最新文章

  1. 浪潮信息英伟达霸榜!MLPerf™最新榜单发布,浪潮信息包揽2021年度近半数冠军...
  2. Django中的常用命令
  3. Bing搜索核心技术BitFunnel原理
  4. python 多文件知识
  5. mysql 独立用户,MYSQL建立独立数据库以及独立数据库用户详细教程(PHPstudy MySQL-Front)...
  6. 如何识别一个字符串是否Json格式
  7. 通过改变浏览器Cookie切换当前网站马甲
  8. redis是干什么的
  9. VScode设置目录分级显示
  10. 用计算机怎么算加权标准差,Tableau,如何计算加权标准差
  11. flex布局 flex_时髦的Flickr Flex小部件
  12. 【MicroPython ESP32】NVS数据非易失性存储示例讲解说明
  13. Bernstein基函数及其性质 matlab实现
  14. outlook怎样同步服务器的文件夹,当您使用辅助在 Outlook 邮箱中的文件夹时的性能和同步问题...
  15. Python在振动信号处理中的应用(五):振动加速度信号转换为速度或位移信号
  16. Jav环境下shell脚本的调用
  17. H.264编码基础知识详解
  18. [18调剂]华侨大学(厦门校区)田晖教授招收2018级计算机或相近专业调剂生
  19. 爱了爱了,三步就能做出可视化大屏的python工具,真香
  20. mysql 插入秒_教你88秒插入1000万条数据到mysql数据库表,IG牛逼

热门文章

  1. CodeForces - 1454E Number of Simple Paths(基环树+思维)
  2. LightOJ - 1409 Rent a Car(最小费用最大流)
  3. HDU - 4686 Arc of Dream(矩阵快速幂,水题)
  4. 安卓入门系列-03安卓的开发方式(逻辑与视图分离)
  5. 计算机中的补码和反码都是二进制吗,计算机中数值型数据二进制形式存储过程中的原码,反码与补码...
  6. 表达式ya是不合法的c语言标识符,《C语言程序设计》试题3及答案
  7. 直接将自身代码注入傀儡进程
  8. 【Boost】boost库中智能指针——weak_ptr
  9. 手把手教你拦截Linux系统调用
  10. 再见了kafka2.0时代,去掉了zk的kafka3.0才是时代新王!