Java泛型的协变】的更多相关文章

在上篇<Java泛型的基本使用>这篇文章中遗留以下问题,即将子类型也能添加到父类型的泛型中,要实现这种功能必须借助于协变. 实验准备 现在在上篇文章展示的Decorator类型的基础上,增加一些代码,如代码清单1所示. 代码清单1 /** * * 描 述:Exp2使用br/> * 作 者:jiaan.gja<br/> * 历 史: (版本) 作者 时间 注释 <br/> * @param itemList */ public void doDecorate2(Li…
泛型擦除 Java的泛型本质上不是真正的泛型,而是利用了类型擦除(type erasure),比如下面的代码就会出现错误: 报的错误是:both methods  have same erasure 原因是java在编译的时候会把泛型,上面的<String>和<Integer>都给擦除掉(其实并没有真正的被擦除,javap -l -p -v -c可以看到LocalVariableTypeTable 里面有方法参数类型的签名). 协变与逆变 理解了类型擦除有助于我们理解泛型的协变与逆…
class Fruit{} class Apple extends Fruit{} class SubApple extends Apple{} class Orange extends Fruit{} class Holder<T>{ private T value; public Holder(){} public Holder(T value){this.value = value;} public T getValue() { return value; } public void s…
在上篇<Java泛型的协变>这篇文章中遗留以下问题——协变不能解决将子类型添加到父类型的泛型列表中.本篇将用逆变来解决这个问题. 实验准备 我们首先增加以下方法,见代码清单1所示. 代码清单1 /** * * 描 述:Exp3使用逆变<br/> * 作 者:jiaan.gja<br/> * 历 史: (版本) 作者 时间 注释 <br/> * @param itemList */ public void doDecorate3(List<? super…
Java1.5版本推出了泛型,虽然这层语法糖给开发人员带来了代码复用性方面的提升,但是这不过是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了.笔者发现很多几年开发经验的程序员,依然不善于使用Java泛型,本文将从Java泛型的基本使用入手,在今后的多篇博文里,对泛型的使用做个总结.本文不会深入Java泛型的实现原理,只会介绍Java泛型的使用. 实验准备 首先需要创建一个类继承体系.以商品为例,每种商品都有基本的名称属性.在大数据应用中,数据表和服务都可以作为商品,表有行数属性…
Java对应泛型的协变和逆变…
在上篇<JAVA泛型——基本使用>这篇文章中遗留以下问题,即将子类型Table或者也能添加到父类型Auction的泛型中,要实现这种功能必须借助于协变. 实验准备 现在在<JAVA泛型——基本使用>一文展示的Decorator类型的基础上,增加一些代码,如代码清单1所示. 代码清单1 /** * * 描 述:Exp2使用br/> * 作 者:jiaan.gja<br/> * 历 史: (版本) 作者 时间 注释 <br/> * @param itemL…
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛型中引入通配符这个概念的时候,Java 其实是支持协变和逆变的. 看下面几行代码:   // 不可变 List<Fruit>fruits =newArrayList<Apple>();// 编译不通过 // 协变 List<?extendsFruit>wildcardFru…
1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型数组. 协变数组好处:使得代码的灵活性更强. 协变数组的坏处:过于灵活导致类型混乱,比如: Peron[] arr = new Employee[5]; //Employee IS-A Person 可以执行 arr[0] = new Student();// Student IS-A Person…
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public class ErasedTypeEquivalence { public static void main(String[] args) { Class c1 = new ArrayList<String>().getClass(); Class c2 = new ArrayList<Integer…