Scala学习——隐式转换
scala隐式转换
一、需求:为一个类添加一个新的方法
java:动态代理
scala:隐式转换
隐式转换例子:
1、man to superMan
package top.ruandb.scala.Course07object ImplicitApp {def main(args: Array[String]): Unit = {//定义隐式转换函数,用于将man成superManimplicit def man2superman(man:Man):SuperMan=new SuperMan(man.name);//实例化一个manval man = new Man("rdb")//返回的是一个超人 man.fly()//t同时它也是一个人man.eat("马铃薯")} } class Man(val name:String){def eat(food:String): Unit ={println(s"${name} 正在吃 ${food}")} } class SuperMan(val name:String){def fly(): Unit ={println(s"${name} is fly ......")} }
2、java IO中File类是没有read方法的,我们可以通过隐式转换添加read方法
package top.ruandb.scala.Course07 import java.io.File object ImplicitApp {def main(args: Array[String]): Unit = {//定义隐式转换函数implicit def file2richfile(file:File) :RichFile = new RichFile(file);val file = new File("D:\\test\\a.txt")//位File类增加了read方法val txt = file.read()println(txt)} } class RichFile(val file:File){def read(): String ={scala.io.Source.fromFile(file.getPath).mkString} }
二、隐式转换切面封装
上面两个小例子中隐式转换函数和业务代码放一起了,正式情况下应该统一封装到一个切面中
package top.ruandb.scala.Course07import java.io.File //将切面引入 import top.ruandb.scala.Course07.ImplicitAspect._object ImplicitApp {def main(args: Array[String]): Unit = {//实例化一个manval man = new Man("rdb")//返回的是一个超人 man.fly()//也可以用的使用引入,用哪个引入哪个//import top.ruandb.scala.Course07.ImplicitAspect.file2richfileval file = new File("D:\\test\\a.txt")//位File类增加了read方法val txt = file.read()println(txt)} } class RichFile(val file:File){def read(): String ={scala.io.Source.fromFile(file.getPath).mkString} } class Man(val name:String){def eat(food:String): Unit ={println(s"${name} 正在吃 ${food}")} }class SuperMan(val name:String){def fly(): Unit ={println(s"${name} is fly ......")} }
package top.ruandb.scala.Course07import java.io.Fileobject ImplicitAspect {//定义隐式转换函数implicit def file2richfile(file:File) :RichFile = new RichFile(file);//定义隐式转换函数,用于将man成superManimplicit def man2superman(man:Man):SuperMan=new SuperMan(man.name); }
三、隐式参数
指的是在函数或者方法中,定义一个implicit修饰的参数,此时scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数
package top.ruandb.scala.Course07import java.io.File //将切面引入 import top.ruandb.scala.Course07.ImplicitAspect._object ImplicitApp {def main(args: Array[String]): Unit = { // testParam//会报错,找不到隐式参数// testParam("lis")//会把lisi String当成隐式参数// implicit val name = "lucy" // testParam //会自动找到name 作为隐式参数// implicit val s1 = "lucy" // implicit val s2 = "lisi" // testParam //报错,不知道用 s1 还是 s2 }def testParam(implicit name:String): Unit ={println(name)} }
三、隐式类
对类增加implicit限定的类,主要作用是对类的加强
package top.ruandb.scala.Course07object ImplicitClassApp extends App {//隐式类传进来是Int,会发现所有的Int都包含add方法implicit class Calculator(x:Int){def add(a:Int): Int = a + x}println(12.add(3)) //默认情况下Int类里没有add方法 }
转载于:https://www.cnblogs.com/jnba/p/10677616.html
Scala学习——隐式转换相关推荐
- 深入理解Scala的隐式转换系统
原文链接:http://www.cnblogs.com/MOBIN/p/5351900.html ---------------------------------------------- 摘要: ...
- 深入理解Scala的隐式转换
摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码. 使用方式: 1.将方 ...
- 大数据Saprk----Spark基础-scala的隐式转换
first Codec **public class Friend {public static void main(String[] args){System.out.println("B ...
- scala之隐式转换
目录 0.隐式转换定义 1.函数隐式转换 2.使用隐式转换加强现有类型 3.隐式转换函数的作用域与导入 4.隐式参数 5.隐式转换的发生时机 0.隐式转换定义 实现方式:隐式转换函数接收的参数类型定义 ...
- Scala的隐式转换详解
隐式转换是在Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转换会让编译器在作用范围内自动推导出来合适的类型. 1.隐式值与隐式参数 隐式值是指在定义参数时前面加上implicit.隐式 ...
- Scala自动隐式转换
底层实现:Scala编译器自动调用了transform方法将5.0转换成Int 在相同作用域内,不能含有多个相同类型的转换规则
- scala学习之旅(十三):隐式转换和隐式参数
文章地址:http://www.haha174.top/admin/article/list 1.引言 scala 提供的隐式转换和隐式参数功能,是非常有特色的功能.是java 等编程语言所没有的功能 ...
- Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...
Scala高级特性 1. 学习目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)
object func {def main(args:Array[String]):Unit={//函数赋值给变量时, 必须在函数后面加上空格和下划线.def sayHello(name: Strin ...
- 【Scala】Scala中的模式匹配、类型参数与隐式转换
1.模式匹配 (1)概述 模式匹配是Scala中非常有特色,非常强大的一种功能.模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理.但 ...
最新文章
- 数据挖掘之离群点检测
- CF464E-The Classic Problem【最短路,主席树】
- java contenttype_POST不同提交方式对应的Content-Type,及java服务器接收参数方式
- 看完就入门系列!吞吐量、消息持久化、负载均衡和持久化、伸缩性…… 你真的了解 Kafka 了吗?...
- JS中的location.href
- 怎么安装ABBYY FineReader
- 微信小程序 服务器触发事件,微信小程序组件间通讯与事件
- AD采样的平均值滤波
- 杭电2149Public Sale
- 排列组合算法之二: 01转换法_java改变后的c++改进版
- C#窗体无法接受Keydown事件
- 构建之法:第八次心得
- 软件测试面试之智力题
- 6个usb口服务器无响应,USB接口不能用(没反应)修复方法
- 邮箱地址是什么,163vip.com怎么注册、价格、申请入口、功能!
- 史上五大最光明的白帽黑客介绍 都有很大技术贡献
- SVG 绘制可交互的中国地图
- 手机怎么识别图片上的文字
- DropdownMenu 下拉菜单的使用
- Survey of Aspect-based Sentiment Analysis Datasets