泛型的使用
1.jdk 5.0新增的特性
在集合中使用泛型之前的情况:
问题一:类型不安全
问题二:强转时,可能出现ClassCastException
在集合中使用泛型的情况:以HashMap为例
优点:
①编译时,就会进行类型检查,保证数据的安全
②避免了强转操作
2.在集合中使用泛型:
总结:
①集合接口或集合类在jdk5.0时都修改为带泛型的结构
②在实例化集合类时,可以指明具体的泛型类型
③指明完以后,在集合类或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化的泛型类型. 比如: add(E e) → 实例化以后: add(Integer e) 根据集合定义的类型决定
④注意点:泛型的类型必须是类,不能是基本数据类型.需要用到基本数据类型的位置,拿包装类替换
⑤如果实例化时,没有指明泛型的类型.默认类型为java.lang.Object类型
3.如何自定义泛型结构:泛型类 泛型接口 泛型方法
类的内部机构就可以使用类的泛型
关于自定义泛型类 泛型接口:
如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
要求: 如果大家定义了类是带泛型的,建议在实例化时要指明类的泛型]
建议:实例化时指明类的泛型
注意:
由于子类在继承带泛型的父类时,指明了泛型类型.则实例化子类对象时,不再需要指明泛型类型
泛型不同的引用不能相互赋值
静态方法中不能使用类的 泛型
异常类不能声明为泛型类
泛型方法在调用时,指明泛型参数的类型
泛型方法:在方法中出现了泛型结构,泛型参数与类的泛型参数没有任何关系
换句话说,泛型方法所属的类是不是泛型类都没有关系
泛型方法,可以声明为静态的.原因:泛型参数是在调用方法是确定的.并非在实例化类时确定
泛型在继承方面的体现
类A是类B的父类, G<A> 和G<B>二者不具备子父类关系, 二者是并列关系
补充: 类A是类B的父类, A<G> 是 B<G> 的父类
通配符: ?
类A是类B的父类, G<A> 和G<B>是没有关系的, 二者共同的父类是: G<?>
添加(写入): List<?> 就不能向其内部添加数据
除了添加null之外
获取(读取): 允许读取数据, 读取的数据类型为Object
有限制条件的通配符的使用
? extends 类A :G<? extends A>可以作为G<A>和G<B>的父类的, 其中B是A的子类
? super 类A :G<? superA>可以作为G<A>和G<B>的父类的, 其中B是A的父类