java协变,逆变,不可变
2017-09-22 20:48
211 查看
协变:
如果Sub是Super的子类型,那么TYPE(Sub)也是TYPE(Super)的子类型。例子:数组是协变的
Object[] objectArray=new Long[1];
因为 Long≦Object; 而且Object[]的引用可以持有Long[]类型的对象。
逆变:
如果Sub是Super的子类型,那么TYPE(Sub)是TYPE(Super)的父类型。List<? super Number> list = new ArrayList<Object>();
不可变:
如果Sub是Super的子类型,那么TYPE(Sub)和TYPE(Super)没有关系。例子:List< Sub >和List< Super >是不可变的。(其实泛型不含通配符都是不可变的)。
网上一般是这么写的:A ≦B代表A直接或间接继承自B
当A ≦ B时,如果有f(A) ≦ f(B),那么f叫做协变;
当A ≦ B时,如果有f(B) ≦ f(A),那么f叫做逆变;
如果上面两种关系都不成立则叫做不可变。
在java中父类型可以持有子类型的引用,但是子类型不可以持有父类型的引用。
package hello; import java.util.ArrayList; import java.util.List; class A{} class B extends A{} class C extends B{} class D extends C{} /** * * 协变,逆变,和不可变 * */ public class SubandSuper { public static void main(String[] args) { //协变 //数组是协变的 Object[] objectArray=new Long[1]; objectArray[0]="I don't fit in";//运行时报错,会抛出异常 //逆变 // List<? super C> list = new ArrayList<B>(); //不可变 //列表是不可变的 List<Object> ol=new ArrayList<Long>();//编译时报错,无法通过编译 } }
相关文章推荐
- Java语言中的协变和逆变
- [置顶] Java中的逆变与协变
- java中的协变与逆变
- Java中的逆变与协变
- Java协变和逆变
- Java 逆变、协变和类型擦除
- java中协变与逆变
- [改善Java代码]警惕泛型是不能协变和逆变的
- Java与Scala的协变与逆变
- Java语言中的协变和逆变(zz)
- Java中的逆变与协变
- Java中的逆变与协变(转)
- java中的逆变、协变、不变概念讲解转载自http://www.cnblogs.com/en-heng/p/5041124.html,感谢编程路上的前辈们!
- Java进阶知识点2:看不懂的代码 - 协变与逆变
- JAVA中有关逆变和协变类型的详解
- Java泛型里的协变和逆变
- Java语言中的协变和逆变
- Java中的逆变与协变
- Java中的逆变与协变