- 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)
- 从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如:List
,这表明该List只能保存字符串类型的对象 - JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参
- 泛型类型不能是基本数据类型
- 静态方法不能使用类的泛型,因为静态方法早于类的创建
- 异常类不能是泛型的
- 不可以T[] arr = new T[],可以T[] arr = (T[]) new Object[],因为T不是实际的类
自定义泛型结构
泛型类,泛型接口,泛型方法
- 如果定义了类是带泛型,建议在实例化时要指明泛型类型
- 泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
- 泛型方法在返回值前加
,否则会被误认为是确定的类
通过通配符定义泛型对象公共父类
1 | List<Integer> list1 = null; |
- 对于List<?>,不能向其内部添加数据,除了添加null
- 可以使用Object类型读取
有限制条件的通配符
通配符指定上限
上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口
通配符指定下限
下限super:使用时指定的类型不能小于操作的类
举例
<? extends Number> (无穷小, Number]
只允许泛型为Number及Number子类的引用调用
<? super Number> [Number, 无穷大)
只允许泛型为Number及Number父类的引用调用
<? extends Comparable>
只允许泛型为实现Comparable接口的实现类引用调用