设为首页 加入收藏

TOP

Scala泛型(二)
2023-07-23 13:24:48 】 浏览:342
Tags:Scala 泛型
(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)

  }
}
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Scala练习 下一篇scala异常和IO

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目