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

原文地址:https://www.cnblogs.com/wnbahmbb/p/6221859.html