1、自定义泛型的两种方式:
①、使用类名后面定义的泛型(所有方法都能用)
格式:直接在类名后面加上<类型>
②、在方法申明上定义自己的泛型(只有当前方法能用)
格式: 修饰符<类型>(这个必须写在修饰符后面,如果有多个修饰符,则放在最后一个的后面)返回值类型 方法名(类型 变量名){}
2、泛型的继承和通配符
2.1、泛型不具备继承性,证明在传递参数的时候泛型写的时什么类型,那么在传递参数的时候就只能传递什么类型。如下所示:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//创建爷父子的对象
ArrayList<Ye> ye = new ArrayList<>();
ArrayList<Fu> fu = new ArrayList<>();
ArrayList<Zi> zi = new ArrayList<>();
//show方法的形参为爷
show(ye);
show(fu); //报错
show(zi); //报错
}
public static void show(ArrayList<Ye> array){
}
}
class Ye{
}
class Fu extends Ye{
}
class Zi extends Fu{
}
2.2、要解决上面的问题,可以使用泛型的通配符(可以限制泛型类型的范围)
? extends E:表示可以传递E或者E所有的子类类型
?super E:表示可以传递E或者E所有的父类类型
解决如下:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//创建爷父子的对象
ArrayList<Ye> ye = new ArrayList<>();
ArrayList<Fu> fu = new ArrayList<>();
ArrayList<Zi> zi = new ArrayList<>();
//show方法的形参为爷
show(ye);
show(fu); //报错
show(zi); //报错
}
public static void show(ArrayList<? extends Ye> array){ //解决方案,表示这里必须用Ye或者Ye的子类
}
}
class Ye{
}
class Fu extends Ye{
}
class Zi extends Fu{
}
标签:show,ArrayList,Ye,class,泛型,public
From: https://blog.51cto.com/u_15433911/7076979