时间:2017-12-20 来源:

Scala入门系列(十二):隐式转换

引言

Scala提供的隐式转换和隐式参数功能符合w3c标准,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,符合w3c标准将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功能.

Scala的隐式转换,html切图 monospace; font-size: 0.9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; outline: none !important;">implicit conversion function.定义的隐式转换函数,手机前端外包只要在编写的程序内引入承接网页制作,就会被Scala自动使用.在程序中使用到隐式转换函数参数类型定义的对象时,承接网页制作会自动将其传入隐式转换函数web切图报价,转换为另外一种类型的对象并返回.这就是“隐式转换”.

隐式转换函数叫什么名字是无所谓的,网站div+css因为通常不会由用户手动调用符合w3c标准,而是由Scala进行调用.但是如果要使用隐式转换,符合w3c标准则需要对隐式转换函数进行导入.因此通常建议将隐式转换函数的名称命名为“one2one”的形式.

隐式转换

要实现隐式转换网页外包接活, monospace; font-size: 0.9em; padding: 2px 4px; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; outline: none !important;">implicit开头web前端制作, monospace; font-size: 0.9em; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.6; word-break: break-all; word-wrap: break-word; color: #333333; background: #f6f6f6; border: 0px; border-radius: 5px; outline: none !important;"> class SpecialPerson(val name: String) class Student(val name: String) class Older(val name: String) // 我们想通过隐式转化把学生和老人转化为特殊人群,承接网页制作这样他们就可以在特殊窗口买票. implicit def object2SpecialPerson(obj: Object): SpecialPerson = { if(obj.getClass == classOf[Student]){ val stu = obj.asInstanceOf[Student]; new SpecialPerson(stu.name) } else if (obj.getClass == classOf[Older]) { val older = obj.asInstanceOf[Older]; new SpecialPerson( older.name) } else Nil } var ticketNumber = 0 // 只接受特殊人群的买票服务 def buySpecialTicket(p: SpecialPerson) = { ticketNumber += 1 "T-" + ticketNumber } // 测试 scala> val stu = new Student("sparks") stu: Student = Student@388623ad scala> val old = new Older("leo") old: Older = Older@3453acd2 // 学生和老人通过隐式转换后均可买特殊票 scala> buySpecialTicket(stu) res9: String = T-1 scala> buySpecialTicket(old) res10: String = T-2

使用隐式转换加强现有类型

隐式转换非常强大的一个功能web切图报价,就是可以在不知不觉中加强现有类型的功能.也就是说,web切图报价可以为某个类定义一个加强版的类符合w3c标准,并定义互相之间的隐式转换函数,html切图制作从而让源类在使用加强版类的方法时网页外包接活,由Scala自动进行隐式转换,网页外包接活然后再调用加强类中特有的方法. 
  
案例:超人变身

class Man(val name: String) // 定义超人类承接网页制作,具有发射激光方法 class Superman(val name: String){   def emitLaser = println("emit a laster!") } // 定义隐式转换函数,div前端切图将普通人转为超人 implicit def man2superman(man: Man): Superman = new Superman(man.name)  defined class Man defined class Superman man2superman: (man: Man)Superman  // 创建普通人类对象sparks scala> val sparks = new Man("leo") sparks: Man = Man@75c56eb9  // sparks通过隐式转换变身超人web切图报价,拥有发射激光方法 scala> sparks.emitLaser emit a laster! 

隐式转化函数的作用域与导入

Scala默认会使用两种隐式转换,web切图报价一种是源类型或目标类型的伴生对象内的的隐式转化函数;一种是当前程序作用域内的可以用唯一标识符表示的隐式转换函数.(上面两个例子都属于第二种情况)

如果隐式转换函数不在上述两种情况下的话符合w3c标准,那么就必须手动使用import语法导入,符合w3c标准例如:import test._ .通常建议,jpg或psd转html仅仅在需要进行隐式转换的地方web前端制作,比如某个函数或者方法内,手机前端外包用import导入隐式转换函数承接网页制作,这样可以缩小隐式转换函数的作用域,承接网页制作避免不需要的隐式转换.

隐式转换触发条件

  1. 调用某个函数web切图报价,但是给函数传入的参数类型与函数定义的接收类型不匹配.(案例:特殊售票窗口) 
  2. 使用某个类型的对象,网站div+css调用某个方法符合w3c标准,而这个方法并不存在于该类型时.(案例:超人变身) 
  3. 使用某个类型的对象,符合w3c标准调用该类中的某个方法网页外包接活,虽然该类型有这个方法,网页外包接活但是给方法传入的参数类型与定义接收类型不匹配(案例:特殊售票窗口加强版)

  
案例:特殊售票窗口加强版

// 定义售票窗口类 class TicketHouse {   var ticketNumber = 0   def buySpecialTicket(p: SpecialPerson) = {     ticketNumber += 1     "T-" + ticketNumber   } }  defined class TicketHouse // 测试 scala> val ticketHouse = new TicketHouse ticketHouse: TicketHouse = TicketHouse@522b2631  scala> val spark = new Student("sparks") spark: Student = Student@588ffeb // 当传入一个学生对象时承接网页制作,触发第三种隐式转换条件 scala> ticketHouse.buySpecialTicket(spark) res2: String = T-1 

隐式参数

隐式参数指的是在函数或者方法中,承接网页制作定义一个用implicit修饰的参数web切图报价,此时Scala会尝试找到一个指定类型的,web切图报价用implicit修饰的对象即隐式值符合w3c标准, monospace; font-size: 0.9em; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.6; word-break: break-all; word-wrap: break-word; color: #333333; background: #f6f6f6; border: 0px; border-radius: 5px; outline: none !important;">class SignPen{ def write(content: String) =println(content) } // 定义隐式参数 implicit val signPen = new SignPen // 函数中使用隐式参数,网页外包接活此时scala会尝试找到一个指定SignPen类型的用implicit修饰的对象 def signForExam(name: String) (implicit signPen: SignPen) { signPen.write(name + " come to exam in time.") } defined class SignPen signPen: SignPen = SignPen@773dab28 signForExam: (name: String)(implicit signPen: SignPen)Unit // 测试:当同学sparks来签到时web前端制作,函数调用隐式参数的值完成签到 scala> signForExam("sparks") sparks come to exam in time.

Java数组与Scala数组的隐式转换

我们知道在Scala代码中,手机前端外包是直接可以调用JDK(JAVA)API的承接网页制作,比如调用一个Java数组类的方法,div前端切图势必可能会传入Java类型的ArrayList,你直接把Scala的ArrayBuffer传入Java接收ArrayList的方法符合w3c标准, monospace; font-size: 0.9em; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.6; word-break: break-all; word-wrap: break-word; color: #333333; background: #f6f6f6; border: 0px; border-radius: 5px; outline: none !important;">// 导入隐式转换函数,jpg或psd转html将scala的buffer类型转换为javalist类型 import scala.collection.JavaConversions.bufferAsJavaList import scala.collection.mutable.ArrayBuffer // 测试 val command = ArrayBuffer("javac", "C:\\Users\\Administrator\\Desktop\\Hello.java") val processBuilder = new ProcessBuilder(command) val process = processBuilder.start() // 转换成功 val res = process.waitFor() res: Int = 2 // 导入隐式转换函数,手机前端外包将javalist类型转换为scala的buffer类型 import scala.collection.JavaConversions.asScalaBuffer import scala.collection.mutable.Buffer // 转换成功 scala> val cmd: Buffer[String] = processBuilder.command() cmd: scala.collection.mutable.Buffer[String] = ArrayBuffer(javac, monospace; font-size: 0.9em; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.6; word-break: break-all; word-wrap: break-word; color: #333333; background: #f6f6f6; border: 0px; border-radius: 5px; outline: none !important;">Int]() javaScores.put("Alice", 3) javaScores.put("Cindy", Int] = javaScores scalaScorces: scala.collection.mutable.Map[String, Alice -> 10, SIZE -> 12) scalaAttrMap: scala.collection.immutable.Map[java.awt.font.TextAttribute, java.awt.font.TextAttribute(size) -> 12) // 转换成功 scala> val font = new java.awt.Font(scalaAttrMap) font: java.awt.Font = java.awt.Font[family=Dialog,style=plain,size=12]

点击次数:5396
作者:
web前端行业资讯
Web new NewsList
谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日继“Angel”开源后,腾讯又开放TDinsight机器学习平台 ,,2017年12月21日谷歌母公司研发“闪光”网络技术无需铺设线缆 ,,2017年12月21日微软投资5千万美元利用人工智能对抗气候变化 ,,2017年12月21日谷歌中国2017:面向开发者的1年AI先行的1年 ,,2017年12月21日GreenKey加入Symphony软件基金会,将开源语音软件 ,,2017年12月21日腾讯发现者揭秘:怎么应对TensorFlow的安全风险,修复有多难 ,,2017年12月21日清华新成立两大交叉研究机构探索智能与未来 ,,2017年12月21日微软将AI融入生产力工具和搜索引擎与其它巨头竞争 ,,2017年12月21日Gfycat将利用机器学习技术创建高分辨率GIF动图 ,,2017年12月21日安全软件公司Avast开源化机器码反编译器RetDec ,,2017年12月21日谷歌开源TFGAN,让训练和评估GAN变得更加简单 ,,2017年12月21日社区对模块化不感兴趣时隔三周经典版FedoraServer27发布 ,,2017年12月21日Windows10加入OpenSSH客户端 ,,2017年12月21日FirefoxQuantum发布一个月安装量1.7亿 ,,2017年12月21日吴恩达宣布创业新项目已与富士康达成战略合作 ,,2017年12月21日Scala入门系列(十二):隐式转换2017年12月20日speedment入门教程2017年12月20日SLAM入门笔记(1):特征点的匹配2017年12月20日深入浅出了解frame和bounds2017年12月20日一道价值20W的CEO面试题 【移动开发】2015年04月01日dalvik启动过程 【移动开发】2015年05月11日了解了这些才能开始发挥jQuery的威力2014年01月29日根据经纬度返回地址的url--GoogleMap 【编程语言】2014年11月11日css+js完美控制图片大小2014年01月29日Android--仿微信滑动,底部图片和字体变化的效果 【Web前端】2014年12月11日freeswitch服务器状态web端监控(可以更换为任意服务器进程) 【系统运维】2015年07月17日查看80端口是否被占用【移动开发】2015年06月25日Android中的DOM解析方式 【编程语言】2014年11月10日HDOJ2196Computer树的直径【编程语言】2014年11月12日Asp.net清空控件值的方法(可自定义控件类型)2014年01月29日Struts2之拦截器原理分析及使用-上 【综合】2014年11月27日shell和命令行参数有关的变量【系统运维】2015年03月13日tomcat发布项目问题汇总 【Web前端】2015年02月02日绝望的SQL ,,2016年06月23日新浪微博之发现【移动开发】2015年08月30日CFGYM100548LastDefence(2014ACM西安现场赛ProblemK) 【编程语言】2015年01月24日【分享】牛牛图片查看器【仿QQ图片查看器】及大致原理说明2015年08月07日IOS开发语言Swift入门连载---协议 【综合】2015年05月19日leetcode||143、ReorderList 【移动开发】2015年05月07日如何在VisualStudio和CodeBlocks中反编译C++代码 【编程语言】2015年06月01日用户名不在sudoers文件中,此事将被报告, 【研发管理】2015年01月21日【实战】sphinx的配置文件 【Web前端】2014年12月03日使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法 【移动开发】2015年07月13日Android源码解析之setContentView 【移动开发】2014年12月18日Redis2.8.18安装报错 【综合】2014年12月23日多种方式计算多项式a0+a1*x+a2*x^2+a3*x^3+.......(计算效率与算法的重要性)2016年11月22日微软:游戏才是HoloLens走近大众的敲门砖 ,,2016年11月17日纯CSS实现扑克牌效果,太牛了吧 【移动开发】2015年04月07日工作中英语积累11【移动开发】2015年02月28日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)