先回忆下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)
}
}