一、泛型
1.基本介绍
传统方法向集合中添加对象不能对加入到集合中的数据进行约束(不安全)。数据存入时要转成Object,遍历时需要进行类型转换(向下转型),如果集合中数据量较大,对效率有影响。因此引出泛型——可接受数据类型的类型。
语法: interface 接口名<T> {} 或class 类名<k,v,…> {} T、K、V都代表数据类型,且必须为引用类型,不能为基本数据类型 一般在创建具体对象时将泛型实例化
- 泛型又称参数化类型,是jdk5.0出现的新特性,解决数据类型的安全性问题
- 在类声明或实例化时只要指定好需要的具体类型即可,传入的类型要求为指定类型或指定类型的子类。如果不写,则泛型默认是Object
- Java泛型可以保证如果程序在编译时没有发出警告,在运行时就不会产生ClassCastException异常,同时使代码更加简介、健壮
ArrayList<MyDate> myDates = new ArrayList<>();
myDates.add(new MyDate(2003,1,1));
myDates.add(new MyDate(2000,1,1));
for (MyDate date : myDates) {
System.out.println(date);
}
2.作用与优点
泛型的作用:可以在类声明时通过一个标识,表示类中某个属性的类型,或某个方法的返回值类型/参数类型
public class Test {
public static void main(String[] args) {
Person<String> person = new Person<String>("Curry");
}
class Person<E> {
E s;
public Person(E s) {
this.s = s;
}
public E f() {
return s;
}
}
泛型的优点:
- 编译时检查添加元素的类型,提高了安全性
- 遍历时不需转换类型,减少了类型转换的次数,提高效率
- 不会提示编译警告
二、自定义泛型
1.自定义泛型类
class 类名<T,R…> { 成员 } T,R为泛型标识符,一般为单个大写字母,可以有多个。
PS:
- 普通成员可以使用泛型(属性、方法)
- 使用泛型的数组不能初始化(因为数组在new时不能确定泛型T的类型,就无法在内存开辟空间)
- 静态方法中不能使用类的泛型(因为静态是和类相关的,在类加载时,对象还未创建。而泛型要在对象创建时指定类型)
- 泛型类的类型是在创建对象时确定的
- 如果在创建对象时,没有指定类型,则默认为Object
class Person<T,R,M> {
R r;
M m;
T t;
public Person(R r,M m,T t) {
this.r = r;
this.m = m;
this.t = t;
}
public M f() {
return m;
}
}
2.自定义泛型接口
interface 接口名<T,R…> { 成员 }
PS:
- 接口中,静态成员也不能使用泛型(同泛型类)
- 泛型接口的类型,在继承接口或实现接口时确定
- 没有指定类型,则默认为Object
interface Iusb<U,R> {
R get(U u);
void hi(R r);
void run(R r1,R r2,U u1,U u2);
default R method(U u) {
return null;
}
}
interface IA extends Iusb<String,Double> {
}
class AA implements IA {
}
class BB implements Iusb<String,Double> {
}
2.自定义泛型方法
修饰符 <T,R>返回类型 方法名(参数列表) { } 泛型提供给方法使用
PS:
- 泛型方法可以定义在普通类,也可定义在泛型类中
- 当泛型方法被调用时传入参数,编译器会确定类型
- 泛型方法可以使用类声明的泛型,也可使用自己声明的泛型
public void eat(E e) {}; 修饰符后没有<>,eat方法不是泛型方法,而是使用了类声明泛型
三、泛型继承和通配符
泛型不具备继承性
通配符:
<?> 支持任意泛型类型<? extends A> 支持A类以及A类的子类,规定了泛型的上限<? super A> 支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
public static void printCollection(List<?> c) {
for (Object object : c) {
System.out.println(object);
}
}
JUnit单元测试
一个类有很多功能代码需要测试,为了测试就要写入到main方法中,如果有多个功能代码测试,就需要来回注销,切换很麻烦。
JUnit是一个Java语言的单元测试框架,多数Java开发环境都集成了JUnit作为单元测试的工具。 JUnit可直接运行一个方法,并返回相关信息
alt + enter 添加JUnit5.4到类路径 完成后可在@Test下的方法处直接进行单独测试运行
|