目录
泛型:
泛型好处:
1)编译时,检查添加元素的类型,提高了安全性
2)减少了类型转换的次数,提高效率
3)不再提示编译警告
泛型介绍:
1、泛型又称为参数化类型,是jdk 5.0 出现的特性,解决数据类型的安全性问题
2、在声明或实例化时只需要指定好需要的具体类型即可
3、java 泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException 异常。同时,使代码更加简洁、健壮
4、泛型的作用:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方法返回值的类型,或者是参数类型
泛型语法:
interface 接口 <T>{} 和 class 类<K,V>{}
//比如 List,ArrayList
说明:
1)其中:T、V、K不代表值,而是表示类型
2)任意字母都可以。常用T表示,是Type 的缩写
泛型实例化:
要在类名后面指定类型参数的值(类型):
1、List<String> strList = new ArrayList<String>();
2、Iterator<Customer> iterator = customer.iterator();
泛型细节:
1)interface List<T> {}, public class HashSet<E>{}...等等
说明:T、E 只是引用类型
2)在给泛型指定具体类型后,可以传入该类型或其子类类型
3)泛型使用形式
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list1 = new ArrayList<>();
4)List list3 = new ArrayList(); 默认给它的泛型是【<E> E就是Object】
自定义泛型:
自定义泛型类:
基本语法:
class 类名 <T,R...>{//可以有多个泛型
成员
}
注意细节:
1)普通成员可以使用泛型(属性,方法)
2)使用泛型的数组,不能够初始化 不能确定数组类型,无法开辟空间
3)静态成员不能使用泛型 静态是和类相关的,当类在加载时,对象还未创建,如果静态方法或属性使用的泛型,JVM就无法进行初始化
4)泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
5)如果在创建对象时,没有指定类型,默认为 Object
自定义泛型接口:
基本语法:
interface 接口名 <T,R...>{}
注意细节:
1、接口中,静态成员也不能使用泛型(与泛型类规定一致)
2、泛型接口的类型,在继承接口或者实现接口时确定 当进行实现某个子接口时,指定了泛型的类型,在实现父接口的方法时,会使用子接口的泛型类型进行替换父接口中的泛型;在实现接口时,直接指定泛型接口的类型,实现方法时,会进行自动替换
3、没有指定类型,默认为 Object
自定义泛型方法:
基本语法:
修饰符 <T,R...> 返回类型 方法名 (参数列表){}
注意细节:
1)泛型方法中,可以定义在普通类中,也可以定义在泛型类中
2)在泛型方法被调用时,类型会确定
3)public void eat(<E> e){},修饰符后没有<T,R...> eat方法不是泛型方法,而是使用了泛型,泛型方法可以使用类声明的泛型,也可以使用自己声明的泛型
泛型的继承与通配符:
1、泛型不具备继承性:
List<Object> list = new ArrayList<String> (); 这是错误的写法
2、<?> 支持任意泛型类型
3、<? extends A> 支持A类以及A类的子类,规范了泛型上限
4、<? super A> 支持A类以及A类的父类,不限于直接父类,规范了泛型下限