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 ...
随机推荐
- ztree树形图自定义图标在jeecg框架中不显示
有时候工作遇到问题,就会硬着头皮去解决,今天给大家说一个ztree树形图自定义图标在jeecg框架中不显示的解决方法 对于这个问题,官方观法说法是在节点元素中加入icon的字段,然后后跟图标的url, ...
- 好用的切换滑动焦点图框架jquery.superslide
拿到学习网站:http://www.superslide2.com/
- Python-Django框架学习笔记——第一课:Hello World
Python Django 有诗云: 孤山寺北贾亭西,水面初平云脚低. 几处早莺争暖树,谁家新燕啄春泥. 乱花渐欲迷人眼,浅草才能没马蹄. 最爱湖东行不足,绿杨阴里白沙堤. 今天在信阳游玩,有幸来到信 ...
- SAP成都C4C小李探花:浅谈Fiori Design Guidelines
Jerry: 我和周帅认识不久,自去年7月SAP成都研究院Cloud for Customer(以下简称为C4C)开发团队组建至今,根据这段时间和周帅愉快的合作经历,我觉得如果把周帅比作我读过的小说里 ...
- MySQL安装和简单操作
MySQL数据库安装与配置详解 MySQL的安装请参考下面这篇博客,讲述的非常详细,各种截图也很清晰.http://www.cnblogs.com/sshoub/p/4321640.html MySQ ...
- POJ-1422 Air Raid---二分图匹配&最小路径覆盖
题目链接: https://vjudge.net/problem/POJ-1422 题目大意: 有n个点和m条有向边,现在要在点上放一些伞兵,然后伞兵沿着图走,直到不能走为止 每条边只能是一个伞兵走过 ...
- 引用类型(三):Function类型
一. Function类型函数实际上是对象.每个函数都是Function类型都实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象都指针.1.函数通常是使 ...
- 第十五章 函数————函数的递归、生成器send 、匿名函数
1.生成器send方法 send的工作原理 1.send发生信息给当前停止的yield 2.再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止 例: persons=[ ...
- B3942 Censoring
爆炸入口 有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程. 这道题确乎是个很好的联系kmp ...
- 修改SVN的地址
方法 1:右键在工作复本的根目录上右键->TortoiseSVN->重新定位 (Relocate),然后修改URL就可以了,但最好先备份一下,据说这样的操作有一定的危险性(至今我没有发现) ...