泛型方法
什么是泛型方法,不是带泛型的方法就是泛型方法,泛型方法有要求:这个方法的泛型参数类型要和当前类的泛型方法的泛型无关
换个角度:泛型方法对应的那个泛型参数类型和当前所在的这个类,是否为泛型类,泛型是啥,无关
泛型方法定义的时候,前面要加上t,原因如果不加的话,会把t当作一种数据类型,然而代码中没有t类型那么就会报错
t的类型实在调用方法的时候确定的
泛型方法是否是静态方法?可以是
代码类型:
public class test02<e> { public void a(e e){ } public static <T> void b(T t){ } static class Demo{ public static void main(String[] args) { test02<String> t2 = new test02(); t2.a("1"); t2.b("abc"); } }
泛型参数存在继承的情况
前面两个引用类型,都可以赋值,为什么list不行?
其实我们用的Arraylist,他的底层是一个Obj类型的数组,我们的泛型负责在编译的时候限制类型,
例子:两个类,a,b两类,a是b的父类,两者是继承关系,但是 G ,G两者不存在继承关系,应为他们都是引用Arraylist所以是同级关系
通配符
当我想要重载不同泛型的list时,常见的重载无法让我们完成需求,于是我们需要通配符
在没有通配符的情况下,下面a方法,相当于重复定义
通配符是什么?
发现:两个类,a,b两类,a是b的父类,两者是继承关系,但是 G< a> ,G< b>两者不存在继承关系,应为他们都是引用Arraylist所以是同级关系但是使用了通配符后,我们发现G<?>变成了G< a> ,G< b>的父类
使用通配符
无边界通配符( ?),固定上边界通配符(?extends 上界类),固定下边界通配符(?super 下界类)
学习主要就是为了方便查看API文档
使用小细节
public void a(List<?> list){ // 遍历 for (Object o : list) { System.out.println(o); } // 数据的写入操作 // list.add("abc");--》出错,不能随意的写入 // 读取操作 Object s = list.get(0); }
泛型受限
并列关系,我们如何限制类型,
用extends的是本类和类所有的子类:定义上限
用super是本类和本类的父类,定义下限
List<Object> a = new ArrayList<>();
List<Person> b = new ArrayList<>();
List<Student> c = new ArrayList<>();
A,B,C三个泛型的类型不相同,Person是Student的父类