美文网首页Scala
Scala 泛型协变与泛型边界

Scala 泛型协变与泛型边界

作者: 数星星的鱼 | 来源:发表于2019-11-22 22:58 被阅读0次

代码准备

class Animal
class Dog extends Animal
class ErHa extends Dog

泛型协变

泛型协变、逆变、不变是指拥有泛型的类在声明和赋值时的对应关系。

协变:声明时泛型是父类,赋值时泛型可以是父类也可以是子类

逆变:声明时泛型是子类,赋值时泛型可以是子类也可以是父类

不变:声明时泛型是什么类型,赋值时也只能是什么类型

代码演示

    class MyList1[+V]   // 协变类型,泛型前面有一个'加号'
    class MyList2[-V]   // 逆变类型,泛型前面有一个'减号'
    class MyList3[V]    // 不变类型,泛型前面'没有符号'
    // 协变 
    val list1_1: MyList1[Animal] = new MyList1[Dog]()       
    // 逆变         
    val list2_3: MyList2[Dog] = new MyList2[Animal]()       
    // 不变
    val list3_2: MyList3[Dog] = new MyList3[Dog]()         

泛型边界

符号 <:>:都是表示泛型的边界,如:

代码演示

class MyList[V <: Dog]   // 泛型 V 必须是 Dog 类或者是 Dog 类的子类,即泛型的上边界为 Dog 类
class MyList2[V >: Dog]  // 泛型 V 必须是 Dog 类或者是 Dog 类的父类,即泛型的下边界为 Dog 类

val m2: MyList[Dog] = new MyList[Dog]()
val m3: MyList[ErHa] = new MyList[ErHa]()

val m4: MyList2[Animal] = new MyList2[Animal]()
val m5: MyList2[Dog] = new MyList2[Dog]()

说明: 此例中泛型声明都是 不变 的,所以声明和赋值时类型要一致

泛型协变遇到泛型边界

类的声明与赋值代码如下:

    // 泛型 V 是 Dog 或者是 Dog 的子类
    // +V 协变, 赋值可以是 V 或者是 V 的子类
    class MyList[+V <: Dog]
    val mlist1_1: MyList[ErHa] = new MyList[ErHa]()
    val mlist1_2: MyList[Dog] = new MyList[ErHa]()

    // 泛型 V 是 Dog 或者是 Dog 的父类
    // -V 逆变, 赋值可以是 V 或者是 V 的父类
    class MyList2[-V >: Dog]
    val mlist2_1: MyList2[Animal] = new MyList2[Any]()
    val mlist2_2: MyList2[Dog] = new MyList2[Animal]()

    // 泛型 V 是 Dog 或者是 Dog 的父类
    // +V 协变, 赋值可以是 V 或者是 V 的子类,但必须大于等于 Dog
    class MyList3[+V >: Dog]
    val mlist3_1: MyList3[Animal] = new MyList3[Dog]()
    val mlist3_2: MyList3[Dog] = new MyList3[Dog]()

    // 泛型 V 是 Dog 或者是 Dog 的子类
    // -V 逆变, 赋值可以是 V 或者是 V 的父类,但不能超过 Dog
    class MyList4[-V <: Dog]
    val mlist4_1: MyList4[ErHa] = new MyList4[Dog]()
    val mlist4_2: MyList4[Dog] = new MyList4[Dog]()

相关文章

  • Scala 泛型协变与泛型边界

    代码准备 泛型协变 泛型协变、逆变、不变是指拥有泛型的类在声明和赋值时的对应关系。 协变:声明时泛型是父类,赋值时...

  • Scala 通俗易懂 ---- 协变、逆变、不变

    协变、逆变、不变 Scala 语言中协变、逆变、不变是指拥有泛型的类型,在声明和赋值时的对应关系 协变:声明时泛型...

  • Kotlin泛型的高级特性(六)

    泛型的高级特性1、泛型实化2、泛型协变3、泛型逆变 泛型实化 在Java中(JDK1.5之后),泛型功能是通过泛型...

  • Kotlin学习笔记 - 泛型

    1. 基本用法 2. 型变 型变包括 协变、逆变、不变 三种: 协变:泛型类型与实参的继承关系相同 逆变:泛型类型...

  • 泛型编程中的型变

    在泛型编程中,经常会提到型变。型变分为两种:协变与逆变。协变covariant表示与泛型参数T的变化相同,而逆变c...

  • Objective-C 泛型 协变 逆变

    为什么要使用泛型 如何使用泛型 限制泛型 协变 逆变 为什么要使用泛型 在使用NSArray, NSSet, NS...

  • Kotlin中的协变、逆变和不变

    共1083字,阅读需要2分钟 泛型实参的继承关系对泛型类型的影响 协变:泛型类型与实参的继承关系相同 逆变:泛型类...

  • Java 泛型与通配符

    参考地址:《Java 泛型,你了解类型擦除吗?》 《Java中的逆变与协变》 《java 泛型中 T、E .....

  • Kotlin 泛型中的 in 和 out

    协变 在 Java 的泛型系统中. 泛型默认是不支持协变(covariant). 也就是说在 Java 中. 即使...

  • Java泛型的理解

    泛型的erasure 数组是协变的

网友评论

    本文标题:Scala 泛型协变与泛型边界

    本文链接:https://www.haomeiwen.com/subject/iddcwctx.html