今天看了一下java泛型的相关知识,简单的总结一下,以后补充
java泛型与c++模板,功能上都是可以实现泛型编程的机制。
c++的模板:
· 有template关键字
· 实例化模板会产生新的类,模板代码膨胀
java泛型:
· java泛型的实例化不会产生新的类,不会导致代码膨胀。
· java的每个泛型类,都有一个对应的 类型擦出 后的 原始类。
· 当调用泛型代码的时候,所有实例化的泛型代码都是调用该泛型的原始类的方法。
· 原始类 是由java泛型,类型擦出以后产生的类。类型擦出以后,类型参数T,用Object来替代,如果T有限定类型,则用 限定类型 来替代类型参数。
· 调用原始类的方法以后,返回的对象往往是Object或者是泛型T的限定类 类型,编译器会自动插入强制类型转换,转换成我们实际实例化的类 类型。
· 为了解决类型擦除与多台的矛盾,java编译器会自动为泛型类的子类,添加一些桥方法,该桥方法的作用是,屏蔽父类中的同名方法,并且调用子类的同名覆盖方法,以实现java的多态。
· java的多态性,是原生支持的。
· java的引用特性,类似与c++中的指针变量。与c++中的引用,不是一个概念。
java通配符(语言表述可能有点难理解):
今天学习了一下通配符的相关概念,乍看起来,还真有点难理解。
下面是从网上copy的通配符的适用原则:
1. 如果你想从一个数据类型里获取数据,使用 ? extends 通配符
· 子类型限定:? extends ClassA。
表明所有的泛型都是ClassA的子类型,但是我们并不具体知道究竟是什么样的子类型(可能是ClassC,也可能是ClassD),
所以使用子类型限定的泛型不允许插入元素,包括ClassA类型的元素。
只能用来获取数据,并且可以保证获取的数据一定ClassA类型的对象,因为ClassA是所有类型参数的父类。
2. 如果你想把对象写入一个数据结构里,使用 ? super 通配符
· 父类型限定:? super ClassB
表明所有的泛型参数都是ClassB的超类,但是我们并不具体知道是ClassB的哪一个超类。所以不允许插入超类类型的元素。但是ClassB的超类也一定是ClassA的超类。
所以可以将ClassA类型的元素插入父类型限定的容器。(假设,ClassA是ClassB的子类)
3. 如果你既想存,又想取,那就别用通配符。
· 这个就不解释了。