泛型的概念
泛型:通过<数据类型>接收一种数据类型,在编译的时候会使用这种数据类型检测集合中的元素,如果元素不是<>中规定的类型,就不允许添加到当前的集合中(编译失败)
泛型作用:
1.使用了泛型不再需要进行容错处理,向下转型,强制类型转换----简化代码
2.将运行阶段的问题提前到编译阶段检查,提高了代码的安全性和编程效率
泛型可以修饰的地方:类,方法,接口
泛型用在类上
在类的后面直接添加<E>,E代表任意一种数据类型,注意:这里不一定是E,任意字母都可以
* 在类上确定的泛型可以直接在方法上使用
* 当泛型没有指定时默认是Object
class Student1<E>{
E tools;
public E getTools() {
return tools;
}
public void setTools(E tools) {
this.tools = tools;
}
}
泛型用在方法上
class Dog<F>{
//1.方法上的泛型与类上的泛型保持一致
public void eat(F f) {
System.out.println(f);
}
//2.方法上独立使用泛型
/*
* 注意:泛型在使用之前一定要先进行定义
* 定义的方式:在当前方法的最前面添加<泛型>
* 作用:让方法与方法内的泛型保持一致
*/
public <E> void song(E e) {
ArrayList<E> arrayList = new ArrayList<>();
System.out.println(e);
}
//3.静态方法上使用泛型
/*
* 必须独立使用
* 方式:在static 后面定义泛型 <泛型>
*/
public static <W> void show(W w) {
}
}
泛型用在接口上
/**
*1.子类上的泛型与接口上的一致
*2.类上的泛型确定了,接口上的泛型就确定了,方法上的泛型就确定了
*/
interface Inte<E>{
public void show(E e);
}
class Pig<E> implements Inte<E>{
@Override
public void show(E e) {
System.out.println(e);
}
}
/**
* 2.接口上使用泛型,子类上不用泛型
* 在实现的接口位置必须指定一个具体的泛型
* 方法使用泛型的情况:
* 1.如果是重写的方法,泛型与接口一致
* 2.如果是子类自己的方法,可以与接口一致,也可以有自己的泛型
*/
class Bird implements Inte<String>{
public void show(String e) {};
}
class Ac<E> implements Inte<E>{
@Override
public void show(E e) {
// TODO Auto-generated method stub
}
public <F> void run(F f) {
}
}