本节来介绍下泛型
如果一个类中有一个方法,你想要限制这个方法只能由你决定的类使用。这个时候就适合用泛型。
泛型相当于一个标志,假如有一个放映厅,在不做限制的情况什么人都能进入。如果我限制只有付了钱的能进。这个付钱就相当于一个标志。而泛型就能起到这么一个作用。
泛型怎么用?
泛型用 用尖括号来表示,具体看以下几种定义和作用
1,泛型类的定义
//定义一个泛型类,里面有一个方法,它的参数和泛型一致
public class School<T> {
public void setT(T t){
if(t instanceof Teacher){
System.out.println("通过");
}else {
System.out.println("出错了");
}
}
}
public static void main(String[] args) {
School<Teacher> school = new School<>();
school.setT(new Teacher());//通过,和泛型yizhi
school.setT(new String());//报错,和泛型不一致
}
首先School的set方法我设置成只有Teacher类才能输出"通过"否则就输出"出错了"
如果你没有写泛型,即直接 School school = new School();
这样你执行上面这个main方法.那么会输出
通过
出错了
但是如果你指定了泛型为Teacher,那么你在写完 school.setT(new String());时它就会报错。而不会在运行的时候才给你报错.
所以泛型的第一个作用,就是一个类中有一个方法,它被设置成只有允许的类能使用。那么定义泛型就能够把运行时才会出的错误提前到编译期就给你提示。
我们平时开发这个作用用到最多的地方就是集合框架.
List<String> list = new ArrayList();
list.add("a");
list.add(2);//报错,和定义的泛型类型不一致
定义了一个List如果你不定义泛型,那么add方法什么东西都能加,但是如果你定义了泛型.那么它就只能添加和泛型类型一致的值.
泛型默认是你放什么类进行都行.放什么这个泛型就会变成什么.但是如果你要指定这个泛型只能放特定的几个类怎么做?
使用<? extends T> 或者 <? super T>来定义泛型
:<? extends T>表示T以及T的子类能够放到这个泛型里
:<? super T>表示T以及T的父类能够放到这个泛型里
public class School<T extends School> {
public void fun (T t){
}
}
public class Teacher extends School{ }
public static void main(String[] args) {
School<Teacher> school = new School();//通过
School<String> school1 = new School();//报错String不是School或School的子类
School school2 = new School();
school.fun(new Teacher());//通过
school.fun(new String());//报错,不是School或School的子类
}
这里就是第二个作用,可以限制一个类中某个方法里面的参数类型。
总结:
1,泛型类怎么定义?
就在类后面用 中间加上内容,内容随便写什么字母都行.一般是写有意义的,比如List中间的E表示element.这里不能写"?" 即<?>
2,泛型日常开发用的最多的是在哪?
用在集合中.集合默认什么都能添加,但指定了泛型后只能添加和泛型一致的值
3,泛型的作用?
(1)你需要指定一个方法只能放特定的类型,在不指定泛型的情况只有在运行时才能检测出非法类型并报错.但指定了泛型后在编译期就能出报错。避免出错。
(2)你需要指定一个方法能放多个你需要的类型,用泛型。泛型能满足你这个需求.
拓展:
在使用集合的时候要习惯的去定义泛型,如果这个集合什么类型都能放,也把泛型定义成Object.这有易于你去遍历操作等。