泛型:
泛型得到实质就是一个类型占位符
泛型的目的就是为了确定数据添加的指定类型而加入的
泛型类(以例子来说明):
如果说再不知道未来name和age的类型的时候,这个时候我们可以使用类型占位符来进行占位
定义泛型类实质就是将现在代码中所以的特定类型换成类型占位符
public class Person{ private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
public static void main(String[] args) {
Person<String> p1=new Person<String>();//在这里我们确定使用string类型
p1.setName("小博");//这里必须使用上面定义的类型(string) 否则就会报错
System.out.println(p1.getName());//运行结果为小博
}
}
泛型方法(例证):
泛型普通方法:
public class Person1<T> {
public void show(T name) { //在这里写了一个T那么也要在类后面加上T 否则报错 (因为方法在类里)
System.out.println(name+"在大夏天喝冰镇可乐");
}
public static void main(String[] args) {
Person1<String> p1=new Person1<String>();//这里在创建对象时使用string类型
p1.show("小博");//那么这里方法的参数也只能是string类型
//运行结果为 小博在大夏天喝冰镇可乐
}
}
同时如果我们使用public static void show(M name){}这种方法的话 方法的泛型类型就与类的泛型无关了
泛型静态方法:
public class Person1<T> {
//静态泛型方法中的类型占位符和类中的泛型占位符是没有关系的
public static <W> void show1(W name) {//这里我们要在前面写一个占位符并使用它
System.out.println(name+"在大夏天喝冰镇可乐(静态方法)");
}
public static void main(String[] args) {
Person1.show1("小博");//输出 小博在大夏天喝冰镇可乐(静态方法)
Person1.show1(22); //输出 22在大夏天喝冰镇可乐(静态方法)
//我们的show1()括号里面可以写任意类型的值 如果在show()方法中定义了要使用那种类型的话 那偶们就只能使用那种类型比如 show(int name);
}
}
泛型接口(实例):
我们创建一个泛型接口:
public interface Per111 <T>{ //这里设置泛型类型 和类相识
public void show(T name);//这里的泛型方法定义 也是和类类似
}
创建一个类来实现泛型接口:
public class Person3 implements Per111<String>{//这里实现泛型接口并指定泛型接口的类型
@Override
public void show(String name) {
System.out.println(name);
}
public static void main(String[] args) {
Person3 p1=new Person3();
p1.show("小博");//输出结果是小博
}
}
需要注意的是如果泛型接口的实现类没有指定具体的泛型类型,必须要在这个实现类中生明一个泛型占位符给接口用
以上为例
Public class Person3 implement Per111{}
泛型擦除模式:
Java中的泛型只存在于编码编译阶段,在运行期间泛型的类型是会被擦除掉的
擦除模式实质上就是在代码运行期间将所以的泛型全部去掉
我们为什么要使用擦除模式那:
是为了兼容jdk老版本的编码
通配符:
T,E,K,V ?:
本质上这些都是通配符,没有什么区别,是我们编码时的一种约定俗成的东西,通常情况下T,E,K,V,?是这样来约定的
?表示不确定的java类型
T(type)表示具体的一个java类型
K V(key value)分别代表java键值中的key Value
E(element)代表Element
通配符一般使用?来表示,我们可以理解为?为泛型中所以类的父类
在java中的继承关系,在泛型中不做任何生命修饰的情况下是不被认可的,所以我们要是有通配符进行处理(使用通配符在泛型中将java中的继承关系重新绑定)
.<? extends T> 代表的是泛型可以传入 T和T的子类的类型(上边界)
.<? super T>** 代表的是传入的必须是T和T的父类类型(下边界)