欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何理解泛型的协变与逆变

程序员文章站 2022-06-22 13:58:47
如何理解泛型的协变与逆变JAVA中的上界: 泛型是用于规范代码输入的编译限制,使用 的语法可以规定泛型的上界,但是会使得集合只能使用add方法不能使用get方法,具体原因是:#mermaid-svg-spw8YskLZZ6I0aCM .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#merm...

如何理解泛型的协变与逆变

  • JAVA中的上界: 泛型是用于规范代码输入的编译限制,使用<T extend 某个类> 的语法可以规定泛型的上界,但是会使得集合只能使用add方法不能使用get方法,具体原因是:

假如在上面得类继承关系中,我们定义 List<T extend Father> list= List<Child1>(),但我们操作这个List时,可以向数组中添加Child1和Child2的实例(子类能被转换成父类),却不能使用其get()方法,因为此时我们不能确定从List中获取的到底是Child1还是Child2类,只能获取到Father类,但是如果我们后面强制转换错误的话就会导致程序出错,因此集合干脆禁止了这种情况下的get方法的获取。

  • JAVA中的下界:使用<T super某个类> 的语法可以规定泛型的下界,但是同样会有限制,导致集合没法调用add方法,只能使用get方法,具体原因是:

定义 List<T super Child> list= List<Father1>(),此时我们调用list的get方法可以直接获得Child的实例类不用强转,但是在调用add方法时,由于父类无法转换为子类,因此无法确定是插入的是Father1还是Father2,毕竟这两个类是无法同存在一个数组中的,因此无法调用add方法(或者只能插入Object类,应为该类是所有类的共同父类)。

  • 而在Kotlin中协变与逆变可以用in和out关键字定义,in表示只能输入,out表示只能输出,即对应生产者和消费者。

本文地址:https://blog.csdn.net/qq_39650441/article/details/111145461

相关标签: Kotlin