java泛型

105 阅读3分钟

泛型:

泛型得到实质就是一个类型占位符

泛型的目的就是为了确定数据添加的指定类型而加入的

泛型类(以例子来说明):

如果说再不知道未来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的父类类型(下边界)