scala高级性质-隐式转换 -02
今天我们来介绍scala的高级特性,上次已经介绍过他的一个特性:高阶函数,这次是隐式转换
1.隐式转换的例子 read的例子
解析:发现这个file没有read的方法,然后就开始在开始在这个上下文里面找看有么有隐式的,
匹配的,如果有,就可以转换,这个里面的匹配是类型的匹配,发现file匹配richfile的匹配
2.匹配符号;
-:逆变:作为偏函数的输入
+:斜变:作为偏函数的输出
则源码为:
trait PartialFunction[-A,+B] extends (A => B),
用的不是很多
3.泛型
【<:】UpperBound 上界(最大不超过什么)
class Pair[T <: Comparable[T]] {
def bigger(first:T,second:T) :T = {
if(first.compareTo(second) > 0) first else second
}
}
object Pair{
def main(args: Array[String]): Unit = {
//选择一:
// val p = new Pair[String]
// println(p.bigger("hadoop","spark"))
//选择二:
val p = new Pair[Integer]
println(p.bigger(5,4))
//选择三:
val p = new Pair[Int]
println(p.bigger(5,4))
}
}
则这个Pair有这样的一个泛型的方法,bigger,比较两个数字,哪个大,
其中Pair[T <:Comparable[T]] 这个是表明这个泛型T的最大的类型不要超过Comparable的这个接口(注:Comparabel这个是类的比较的方法,)
每一个选择,在一个类总只能出现一次,如果当这个伴生的对象里面的是
选择一:正确,输出spark,应为String类型属于java.lang.String,实现于Comparable
选择二:正确,输出5,java.lang.Integer实现与Comparable
选择三:错误,应为scala.Int不继承与实现Comparable
【>:】LowerBound 下界
最低的界限,如果要满足,要比这个高才行
则我们可以看java的代码,是? List<? super korean>,只要传入的是Korean的父类即可
同理,我们scala用>:表示
【<%】:ViewBound
视图定界:
例如:我们假如有两个类,一个girl,一个boy,我们要对这两个对象进行比较,以前我们的做法是对boy里面的重写companyto的方法,然后在进行比较,但是这个方法有一个弊端,就是对于每一个类,我们都要重写这个比较,
1.首先我们要有一个Girl类:
class Girl(val name:String ,var faceValue :Int) {
}
2.隐式转换,girl的比较
object MyPredef {
implicit def girl2Order(g:Girl) = new Ordered[Girl]{
override def compare(that: Girl): Int = {
g.faceValue-that.faceValue
}
}
}
3.主函数调用
//<% 视图定界,默认此时的T就是相当于Ordered里面的T,一定要传入一个隐式转换函数
// 第一种方法
class Chooser[T <% Ordered[T]] {
def choose(first:T,second:T) :T ={
if(first > second) first else second
}
} object Chooser{
def main(args: Array[String]): Unit = {
import MyPredef._
val c = new Chooser[Girl]
val g1 = new Girl("anglebaby",90)
val g2 = new Girl("gsy",999)
val g = c.choose(g1,g2)
}
}
【:】ContextBound
scala高级性质-隐式转换 -02的更多相关文章
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- Scala学习笔记--隐式转换
隐式转换的规则:1.无歧义规则:隐式转换唯有不存在其他可插入转换的前提下才能插入 若编译器有两种方法修正x+y 如convert1(x)+y,convert2(x)+y,会报错2.单一调用规则:只尝 ...
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- Scala入门系列(十二):隐式转换
引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...
- Scala 隐式转换及应用
什么是隐式转换 我们经常引入第三方库,但当我们想要扩展新功能的时候通常是很不方便的,因为我们不能直接修改其代码.scala提供了隐式转换机制和隐式参数帮我们解决诸如这样的问题. Scala中的隐式转换 ...
- Scala隐式转换
package big.data.analyse.scala import java.io.File import scala.io.Source /** * 隐式转换 * Created by zh ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
- Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)
object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...
- Scala学习之路 (八)Scala的隐式转换和隐式参数
一.概念 Scala 2.10引入了一种叫做隐式类的新特性.隐式类指的是用implicit关键字修饰的类.在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换. 隐式转换和隐式参数是Scal ...
随机推荐
- (C#) Handling and Raising Events
Handling and Raising Events .NET Framework 4.5 Other Versions 6 out of 20 rated this helpful - ...
- 用Python爬虫对豆瓣《敦刻尔克》影评进行词云展示
最近很想看的一个电影,去知乎上看一下评论,刚好在学Python爬虫,就做个小实例. 代码基于第三方修改 原文链接 http://python.jobbole.com/88325/#comment-9 ...
- 开发中常用的sql语句二
sql 数字全角半角转换 create FUNCTION dbo.ConvertWordAngle ( ), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )) A ...
- check_mk手动安装
官方omd rpm包安装 yum -y install /tmp/check-mk-raw-1.2.6p2.demo-el6-34.x86_64.rpm omd create la omd confi ...
- php的yii框架开发总结3
利用yii里面的gii工具可以很容易的自动创建数据表相应的的CURD操作的基于MVC的文件: 首先,打开:自己网站/protected/config/main.php文件 'modules'=> ...
- 微信小程序实现获得用户手机号
具体操作方法如下: 使用方法 需要将 <button> 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumb ...
- Open Data for Deep Learning
Open Data for Deep Learning Here you’ll find an organized list of interesting, high-quality datasets ...
- Altium_Designer-原理图库如何添加低电平有效的管脚?
在编辑元件原理图符号时,在display name选项中将要加低电平的字符后面都加上“\”即可,如图:
- QT学习之QScript
QT中有解析Json的一个类叫QScript.貌似还有一个QJson,但听说解析的方便性不如QScript,具体没有深入探究,这里仅简单记录一下QScript的使用. 首先,主要使用到的类有QScri ...
- vuejs非父子组件传值
当父组件要给孙子,或者孙子与孙子要传值的时候怎么传,一层一层传太麻烦了,vuejs提供了一中模式叫发布订阅模式(观察者模式,bus,总线)来处理非父子组件间的传值 <div id='root'& ...