(Cat(10,100),Cat(20,80),new Ordering[Cat] {
override def compare(x: Cat, y: Cat) = x.age - y.age
})
//咱们不是有隐式转换嘛,能不能把这个比较器呢?
//我上下文中找找,有没有什么隐式的比较器可以拿过来用,如果有我就直接拿过来,这样就不用传比较器了,去偷一个不香嘛
//bigger3[T :Ordering] 注意:如果想让他自己偷一个,那么需要实现上下文界定,不然是没办法使用的
def bigger3[T :Ordering](t: T,t1:T):T={
if(implicitly[Ordering[T]].compare(t,t1)>0) t else t1
}
/**
* 两种创建隐式比较器对象的写法
*/
// implicit val value: Ordering[Cat] = new Ordering[Cat] {
// override def compare(x: Cat, y: Cat) = x.age - y.age
// }
implicit val value1 = Ordering.by[Cat,Int](cat=>cat.age)
bigger3[Cat](Cat(10,100),Cat(20,80))
}
}
逆变,协变,不变
语法: 不变:默认 协变: +T 逆变: -T
package com.doit.day02
/**
*
* 不变:默认
* 协变: +T
* 逆变: -T
*/
object _15_逆变协变不变 {
def main(args: Array[String]): Unit = {
class Box[T](t:T)
class Pencil
class YZPencil extends Pencil
/**
* 本身我的pencil 和YZpencil 是父子关系
* 那么按照常理来说,我装笔的盒子也是圆珠笔的盒子的父类,这样的话咱们能够理解
* 我盒子既然能装笔,而且圆珠笔又是笔的父类,所以我这个盒子应该能装圆珠笔
* 毕竟有多态的存在,我的笔本身可以接收圆珠笔的 ==>理解 ?
*/
val box1: Box[Pencil] = new Box[Pencil](new Pencil)
val box2: Box[YZPencil] = new Box[YZPencil](new YZPencil)
//但是在代码中,却不能这么操作 虽然圆珠笔和笔存在父子关系,但是一旦把他们装在盒子中,就不存在这样的关系了
//这种的关系我们称他为不变
// val box3: Box[Pencil] = new Box[YZPencil](new YZPencil) //报错
//如果想让他们依然有关系,可以的,scala给我提供了另外一种方式叫协变和逆变
class Box1[+T](t:T)
class Pencil1
class YZPencil1 extends Pencil1
//本身圆珠笔是笔的子类,加上了协变这么一个操作 那么装笔的盒子就是装圆珠笔的父类了
val box3: Box1[Pencil1] = new Box1[YZPencil1](new YZPencil1)
// 逆变
//如果想让他们依然有关系,可以的,scala给我提供了另外一种方式叫协变和逆变
class Box2[-T](t:T)
class Pencil2
class YZPencil2 extends Pencil2
//本身圆珠笔是笔的子类,加上了逆变这么一个操作 那么装笔的盒子就是装圆珠笔的子类了(父子关系颠倒过来了)
val box4: Box2[YZPencil2] = new Box2[Pencil2](new Pencil2)
}
}
|