回顾总结14
泛型
之前存在的问题
- 不能对加入到集合ArrayList中的数据类型进行约束(不安全)
- 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响。
- 集合中是可以加入所有Object类型的元素的,不好统一管理,调用方法。
优点
- 编译时,检查添加的元素,提高了安全性
- 减少了类型转换的次数,提高了效率
- 不再提示编译警告
含义
泛型可看做广泛类型,可以代表一类对象
-
泛型又称参数化类型,是JDK5.0出现的新特性,解决数据类型的安全性问题
-
在类声明或实例化时只要指定好需要的具体的类型即可
-
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮
-
泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或是某个方法的返回值的类型,或者是参数类型
//E具体的数据类型在定义的Person对象的时候指定,即在编译期间,就确定E是什么类型 Person<String> person = new Person<String>(); class Person<E>{ E s;//表示s的数据类型,该数据在定义Person对象的时候指定 public Person(E s){//E也可以是参数类型 this.s = s; } public E f(){//E也可以是返回值类型 return s; } } //当新建对象的时候,可以传进去E的具体类型 //比如String,E和String的关系类似,形参和实参。
details
- 泛型存放的只能是引用类型,不能是基本数据类型
- 指定泛型具体类型后,可以传入子类或者实现类。多态的用法。
- 泛型使用形式
- List
list = new ArrayList (); - List
list = new ArrayList<>();简写推荐
- List
- 默认是使用了Object的泛型的
自定义泛型
基本语法
class 类名<T,R...>{}
detials
- 普通成员可以使用泛型(属性、方法)
- 使用泛型的数组,不能初始化
- 静态方法中不能使用类的泛型
- 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定确定类型)
- 如果在创建对象时,没有指定类型,默认为Object
class Tiger<T,R,M>{
String name;
R r;//属性使用泛型
M m;
T t;
public Tiger(String name,R r,M m,T t){
//构造器使用泛型
this.name = name;
this.r = r;
this.m = m;
this.t = t;
}
public R setR(){//方法使用泛型
}
}
自定义泛型类
-
T,R,M泛型的标识符,一般是单个大写字母
-
泛型标识符可以有多个
-
普通成员可以使用泛型(属性、方法)
-
使用泛型的数组,不能初始化
泛型是在创建对象时给予,初始化是在类的加载时开辟空间(不确定空间的大小)
-
静态方法中不能使用类的泛型
泛型是在创建对象时给予,静态成员(属性、方法)是在类的加载时确定,给予空间,初始化
自定义泛型接口
接口的属性都是静态的。不能在接口里定义泛型属性
使用到了泛型,但是没有指定泛型种类的,会默认有Object,但是不易于阅读,所以不建议省略
自定义泛型方法
修饰符<T,R...>返回类型 方法名(参数列表){}
details
- 泛型方法,可以定义在普通类中,也可以定义在泛型类中
- 当泛型方法被调用时,类型会确定
- public void eat(E e){}修饰符后没有<T,R...>eat方法不是泛型方法,而是使用了泛型(泛型是不能凭空使用的,方法没有定义泛型,只能使用类的泛型)
继承和通配符
- 泛型不具备多态。不能定义父类,传递子类
- :支持任意泛型
- :支持A类以及A类的子类,规定了泛型的上限
- :支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
JUnit
Java语言的单元测试框架
多出Java的开发环境都已经继承了JUnit作为单元测试的工具

浙公网安备 33010602011771号