scala 泛型 ViewBound

先回忆下ViewBound,形如B<%A,表示B类型要转化成A类型。

老师教我们的记忆:因为%像眼镜,表示能看见,我去。

练习:仍然是从一堆女孩中选择一个女神出来。

1、定义元数据,MyGirl类

class  MyGirl(val name:String,val age:Int,val faceValue:Int){

}

2、定义隐式转换方法

package testimplicit

import scalapackage.testfanxing.MyGirl

/**
  * Created by Germmy on 2018/4/8.
  */
object MyPreDef {

  /**
    * 法一
    * @param g
    * @return
    */
  //  implicit  def selectGirl=(g:MyGirl)=>new Ordered[MyGirl] {//这个地方如果不用=>,用另外一种方式看行不行
//    override def compare(that: MyGirl): Int = {
//      if(g.faceValue==that.faceValue){
//        that.age-g.age//这个必须反过来
//      }else{
//        g.faceValue - that.faceValue
//      }
//    }
//  }

  /**
    * 法二
    * @param g
    * @return
    */
  implicit  def selectGirl(g:MyGirl)=new Ordered[MyGirl] {//这个地方如果不用=>,用另外一种方式看行不行
    override def compare(that: MyGirl): Int = {
      if(g.faceValue==that.faceValue){
        that.age-g.age//这个必须反过来
      }else{
        g.faceValue - that.faceValue
      }
    }
  }

}

注意:这里的隐式转换是难点

2.1、其中,法一用到是一种特殊写法,用=>,当然如果理解了方法的2种实现方式也就不难理解了

2.2、练习的要求是谁颜值高选谁,但是在颜值相同的情况下选年龄较小的。

2.3、关于方法的定义有2种方法,一种是用def m1(x:Int)(y:Int)=x*y,一种是def m1(x:Int)=x=Int=>x*y

这里我2种方法都试了,都可以

3、定义main

package scalapackage.testfanxing

/**
  * Created by Germmy on 2018/4/15.
  */
class ViewBoundDemo[T <% Ordered[T]] {
  def select(g1:T,g2:T) ={
    if (g1 > g2) g1 else g2;
  }
}


object  ViewBoundDemo{
  def main(args: Array[String]) {
    import  testimplicit.MyPreDef.selectGirl
    val vbd= new ViewBoundDemo[MyGirl]
    val g1=new MyGirl("biaozi",20,120)
    val g2=new MyGirl("erdiao",15,120)
    val g3=vbd.select(g1,g2)
    println(g3.name)
  }
}

猜你喜欢

转载自my.oschina.net/windows20/blog/1795940