泛型
1、概述
即"参数化类型",将类型由原来的具体类型进行参数化,类似方法中的变量参数,类型也可以定义成参数类型(称为:类型参数),然后使用/调用时传入具体的类型(类型实参)。
2、泛型使用
1. 泛型类
最常用(掌握)
public class Demo1<T> { //泛型类
private T data;
public T getData(){
return data;
}
public void setData(T data){
this.data = data;
}
}
_____________
class Person<R,E,W >{}//多个泛型之间用,隔开
public class Test1 { //常用类
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 泛型接口
定义:
public interface Demo2 <T> {
T getData();
}
指定类型
public class Demo3 implements Demo2 <String> {
private String text;
@Override
public String getData() {
return text;
}
}
不指定类型
public class Demo3 implements Demo2 <T> {
private T data;
@Override
public T getData() {
return data;
}
}
3. 泛型方法
private static <T> T 方法名(T a,T b){}
//main方法中泛型方法的使用
print("nicko");
print(123244534); //自动装箱为Integer类型数据
print(23.2);
public static <A> void print(A a){
System.out.println(a); //这里的a只在本方法中有用
}
4. 泛型限制类型
package sec1;
/**
* 泛型限制符和通配符
* 限制符 extends --> 接口中使用
*/
public class Demo4 {
public static void main(String[] args) {
Plate<Apple> p = new Plate<>();
}
}
interface Fruit{} //定义一个fruit类的接口
class Apple implements Fruit{} //Apple类实现fruit类
/**
* 泛型类Plate 接受类型 限定为 Fruit 类的子类
* @param <T>
*/
class Plate<T extends Fruit>{
T data;
}
5. 泛型中的通配符
类型通配符是使用 ? 代替方法具体的类型实参
1 <? extends Parent>指定了泛型类型的上届
2 <? super child>指定了泛型类型的下届
3 <?>指定了没有限制的泛型类型 可以作为Object对象看待
Object可以传String,Integer;但是?改String后,就只能是String类型参数
public static void main(String[] args) {
//错误提示:不能讲一个装着苹果的盘子,看做一个装着水果的盘子
// Plate<Fruit> p1 = new Plate<Apple>();
//? 通配 new Plate<Apple> 是 Fruit 的子类
Plate<? extends Fruit> p2 = new Plate<Apple>();
//? 通配 new Plate<Fruit> 是 Apple 的父类或者父类的父类
Plate<? super Apple> p3 = new Plate<Fruit>();
}
3、泛型作用
- 提高代码复用率
- 泛型中的类型在使用时指定,不需要强制类型转换(泛型安全,编译器会检查类型)
4、使用注意
编译后程序会采取 去泛型化 的措施,java中的泛型只在编译阶段有效.
编译过程中,正确检查泛型结果后,会将泛型的相关信息撤出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。泛型信息不会进入运行阶段.