泛型的使用
-
JDK 5.0新增的特性
-
在集合中使用泛型:
总结:
① 集合接口或集合类在JDK 5.0时都修改为带泛型的结构
② 在实例化集合类时,可以指明具体的泛型类型
③ 注意点:泛型的类型必须是类类型,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
④ 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型
对于
Map<String,Integer> map = new HashMap<String,Inetger>();
JDK 7新特性:类型推断可以省略后面尖括号中的类型,即写为:
Map<String,Integer> map = new HashMap<>();
-
如何自定义泛型结构:泛型类、泛型接口;泛型方法
关于自定义泛型类、泛型接口:
如果定义了泛型类,实例化时没有指明类的泛型,则认为此泛型类型为Object类型
要求:如果大家定义的类是带泛型的,建议在实例化时要指明类的泛型。
由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不需要指明泛型。
-
泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
换句话说,泛型方法所属的类是不是泛型类都没有关系
泛型方法,可以声明为静态的。因为:泛型参数是在调用方法时确定的。并非在实例化时确定。
泛型在继承方面的体现
虽然类A是类B的父类,但是 G<A>
和 G<B>
二者不具备子父类关系,二者是并列关系。
补充:类A是类B的父类,A<G>
是 B<G>
的父类
通配符的使用
通配符:?
类A是类B的父类,G<A>
和 G<B>
是没有关系的,二者共同的父类是:G<?>
有限制条件的通配符的使用
? extends A:
G< ? extends A > 可以作为 G<A>
和 G<B>
的父类,其中B是A的子类 --> 范围相当于 [负无穷,A]
? super A:
G< ? super A >可以作为 G<A>
和 G<B>
的父类,其中B是A的父类 --> 范围相当于 [A,正无穷]