今天我们来介绍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的更多相关文章

  1. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

  2. Scala学习笔记--隐式转换

    隐式转换的规则:1.无歧义规则:隐式转换唯有不存在其他可插入转换的前提下才能插入  若编译器有两种方法修正x+y 如convert1(x)+y,convert2(x)+y,会报错2.单一调用规则:只尝 ...

  3. 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数

    Scala高级特性 1.    课程目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

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

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

  5. Scala 隐式转换及应用

    什么是隐式转换 我们经常引入第三方库,但当我们想要扩展新功能的时候通常是很不方便的,因为我们不能直接修改其代码.scala提供了隐式转换机制和隐式参数帮我们解决诸如这样的问题. Scala中的隐式转换 ...

  6. Scala隐式转换

    package big.data.analyse.scala import java.io.File import scala.io.Source /** * 隐式转换 * Created by zh ...

  7. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  8. Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)

    object func { def main(args:Array[String]):Unit={ //函数赋值给变量时, 必须在函数后面加上空格和下划线. def sayHello(name: St ...

  9. Scala学习之路 (八)Scala的隐式转换和隐式参数

    一.概念 Scala 2.10引入了一种叫做隐式类的新特性.隐式类指的是用implicit关键字修饰的类.在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换. 隐式转换和隐式参数是Scal ...

随机推荐

  1. 栅格那点儿事(四A)---栅格的显示与渲染

    栅格的显示与渲染 通过前两章的学习,应该对栅格这个东西不那么陌生了.在这一个部分,我们来看看如何展示出栅格数据最美丽的地方,在ArcGIS中栅格的显示与渲染.在进入细节之前,先来看看在ArcGIS中都 ...

  2. 问问javascript

    问题1:在创建新函数(如function P(){};)的时候会自动创建一个原型对象P.prototype(也称作原型属性prototype).当创建一个新对象(此处指非函数对象,在js里面函数也会被 ...

  3. intel Skylake平台安装WIN7

    目前针对IntelSkylake平台安装WIN7时USB接口失灵的问题,不少硬件厂商都推出了免费修改工具来集成XHCI USB控制器驱动,这其中技嘉提供了一款Windows USB Installat ...

  4. Quick How-To deny/allow IP using iptables

    How to block an IP using iptables? iptables -A INPUT -s xx.xx.xx.xx -j DROP How to block an IP for a ...

  5. vos话务抽查小方法

    问题: 假如现在公司落地前缀主要有三个分别如下: 9150:主要用来走正规量 880:用来走正规量 660:全业务(合法) 已知: 非法业务量主要有:博彩,发票,白银,黄金,期货 合法非正规量有:保健 ...

  6. May 1 2017 Week 18 Monday

    The very essence of romance is uncertainty. 浪漫的精髓就在于它充满了种种可能. Yesterday my girl friend told me that ...

  7. 前端高质量知识(一)-JS内存空间详细图解

    变量对象与堆内存   var a = 20;   var b = 'abc';   var c = true;   var d = { m: 20 } 因为JavaScript具有自动垃圾回收机制,所 ...

  8. BestCoder Round #91 1001 Lotus and Characters

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6011 题意: Lotus有nn种字母,给出每种字母的价值以及每种字母的个数限制,她想构造一个任意长度的 ...

  9. 2018.7.31 oracle rownum的理解

    一.Rownum的描述: rownum是一个伪列,数据库中并不保存rownum的列值,它是oracle系统为返回的结果集顺序分配的行编号,rownum是随着结果集生成的,一旦生成,在同一个结果集中就不 ...

  10. OnCollisionEnter和OnTriggerEnter

    之前对这两个的用法不是特别清楚,重新学习了下,再做个测试看看效果如何: 1.新建一个场景test 2.添加一个cube,点击Inspector面板会发现系统已经默认添加了Box collisder组件 ...