泛型
语法
泛型的声明
Interface 接口 < T >{} 和 Class类 <K,V>{}
比如:List,ArrayList
说明:
- 其中,T、K、V不代表值,而表示类型
- 任意字母都可以。常用T表示,是Type的缩写
泛型的好处
- 编译时,检查添加的元素的类型,提高了安全性
- 减少了类型转换的次数,提高了效率
使用的注意事项和细节
-
Interface List< T >{},public class HashSet< E >{}...等等
T、E只能是引用类型(类、接口、数组)
-
在给泛型指定具体类型后,可以传入该类型或者其子类类型
-
实际开发中我们推荐后面的<>里面不放类型,这样更简洁
自定义泛型类
基本语法1
class 类名<T、R...>{//...表示可以有多个泛型
成员
}
注意细节
- 普通成员可以使用泛型(属性、方法)
- 使用泛型的数组,不能初始化
- 静态方法中不能使用类的泛型
- 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
- 如果在创建对象时,没有指定类型,默认为Object
基本语法2
interface 接口名<T、R...>{
}
注意细节
- 接口中,静态成员也不能使用泛型(这个和泛型类规定一样)
- 泛型接口中的类型,在继承接口或者实现接口是确定
- 没有指定类型,默认为Object
基本语法3
修饰符 <T、R...>返回类型 方法名(参数列表){
}
注意细节
- 泛型方法,可以定义在普通类中,也可以定义在泛型类中
- 当泛型方法被调用时,类型会确定
- public void eat(E e){} 修饰符后没有<T、R...> eat方法不是泛型方法,而是使用了泛型
使用传统方法的好处,不能对加入到集合ArrayList的数据类型进行约束,遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响
泛型的继承和通配符说明
<?>:支持任意泛型类型
<?extends A>:支持A类以及A类的子类,规定了泛型的上线
<? super A>:支持A类以及A类的父类,不限于直接父类,规定类泛型的下线