java泛型

今天看了一下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. 如果你既想存,又想取,那就别用通配符。

· 这个就不解释了。

posted @ 2013-08-02 17:14  wanglc_work  Views(380)  Comments(0Edit  收藏  举报