如何理解泛型的协变与逆变
程序员文章站
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