本系列博客是韩顺平老师java基础课的课程笔记,B站:课程链接,吐血推荐的一套全网最细java教程,获益匪浅!
韩顺平P553-P568
- 1. 泛型的理解和好处
- 2. 泛型的定义
- 3. 泛型的语法
- 4. 泛型的细节
- 5. 自定义泛型
- 6. 泛型继承和通配符
- 7. Junit
1. 泛型的理解和好处
传统方法的缺点
- 使用传统的方法不能对加入到集合中的数据类型进行约束(不安全)
- 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响
泛型的好处
- 编译时,检查添加元素的类型,提高了安全性
- 减少了类型转换的次数,提高效率
- 不再提示编译警告
2. 泛型的定义
- 泛型又称为参数化类型,是jdk5.0出现的新特性,解决数据类型的安全性问题
- 在类声明或实例化时只要指定好需要的具体类型即可
- 泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生classCastException异常。同时diamante更加简洁健壮。
- 泛型的作用是可以在类声明时通过一个标识表示类中的某个属性的类型,或者某个方法的返回值类型,或者是参数类型
class xgs<E>{
E e; // 泛型表示数据的类型(在定义xgs对象时指定)
public xgs(E e) {// 泛型可以是参数类型
this.e = e;
}
public E f(){ // 泛型可以是函数的返回值类型
return e;
}
}
3. 泛型的语法
泛型的声明
- interface{} 或者 class <K,V>{}
- 其中TKV 不代表值,而是表示类型
- 任意字母都可以,常用T表示,是Type的缩写
泛型的实例化
- 要在类名后指定类型参数的值(类型)
- List strList=new ArrayList();
4. 泛型的细节
- interface List {} 其中T只能是引用类型,不可以放基本数据类型(int不能放,integer可以放)
- 在给泛型指定了具体类型之后,可以传入该类型或者其子类类型
- 泛型的使用形式:List strList=new ArrayList(); 可以简写为List strList=new ArrayList<>(); 在实际的开发中往往采用简写的方式
- List strList=new ArrayList(); 泛型默认为Object,也就是等价于List strList=new ArrayList<>();
5. 自定义泛型
自定义泛型类
- 基本语法:class 类名<T,R…>{}
- 普通成员(属性、方法)可以使用泛型
- 静态方法和静态属性不能使用泛型:因为静态方法是和类相关的,在类加载的时候对象还没有创建,即还没有确定出泛型的类型,所以不能用。
- 使用泛型的数组不可以初始化(不可以在定义的时候给长度):因为数组在new时,不能确定T的类型,所以无法开辟内存空间
- 泛型类的类型是在创对象的时候确定的(因为创建对象时,需要指定类型),如果没有指定,默认为Object
自定义泛型接口
- 基本语法:interface 接口名<T,R…>{}
- 接口中,静态成员不能使用泛型(和自定义泛型类规定一样)
- 泛型接口的类型,在继承接口或者实现接口的时候确定的
- 没有指定类型,默认为Object
自定义泛型方法
- 基本语法:修饰符 <T,R…> 返回类型 方法名(参数列表){}
- 泛型方法可以定义在普通类中,也可以定义在泛型类中
- 当泛型方法被调用时,传入参数,类型会被确定
- public void eat(E e){} 修饰符后没有<T,R…> eat方法不是泛型方法,只是使用了泛型
- 泛型方法可以使用类声明的泛型,也可以使用自己的泛型
6. 泛型继承和通配符
- 泛型不具备继承性:不允许:List list=new ArrayList()
- 通配符
- <?>支持任意泛型类型
- <? extends A>:支持A类以及A类的子类,规定了泛型的上线
- <? super A>:支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
7. Junit
为什么需要Junit
- 一个类有很多代码需要测试,为了测试就需要写入到主方法中
- 如果一个类有多个功能代码测试,就需要来回注销很麻烦
- 如果可以 直接运行一个方法,就方便很多,并且可以给出相关信息