zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    浅谈MVC架构模式
    用JSP实现学生查询
    读cookie中文字符乱码问题
    span 换行与不换行
    SAP HANA中的Synonym使用及demo 沧海
    SAP HANA HDB序列的使用方法及技巧(SAP HANA HDB SEQUENCE ) 沧海
    SAP HANA中创建与时间相关的数据及Time Attribute View(Fiscal) 沧海
    SAP HANA中创建与时间相关的数据及Time Attribute View(Gregorian) 沧海
    SAP HANA如何在存储过程中使用自定义的table type 沧海
    SAP HANA SQL执行计划(SAP HANA SQL explain plan)(SQL 优化分析) 沧海
  • 原文地址:https://www.cnblogs.com/wnbahmbb/p/6221859.html
Copyright © 2011-2022 走看看