泛型是指类型参数化。意思是允许在定义类、接口、方法中使用类型形参,当使用时(创建对象时)指定具体类型,所有使用该泛型参数的地方都被统一化,保证类型一致。如果未指定具体类型,默认是Object类型。集合体系中的所有类都增加了泛型,泛型也主要用在集合
泛型:可以在类或方法中预知的使用未知的类型
用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
泛型在定义的时候不具体,使用的时候才变得具体。在使用的时候(创建对象时)确定泛型的具体数据类型。
注:一般在创建对象时,将未知的类型确定具体的类型。当没有指定具体的类型时,默认类型为Object类型。
泛型的定义
泛型类:public class Demo {} ,T表示未知类型。
泛型接口:public interface ImplDemo<T,V>{} ,和定义类一样(接口就是一个特殊类)。
泛型方法:public void demo1(T name){System.out.println(name);} , public T demo2(T t){ return t;}
泛型的好处:
1.编译时确定类型,保证类型安全,避免类型转换异常
2.避免了强制类型转换
3.代码利于重用,增加通用性
泛型的限制和规则
· 泛型的类型参数只能是引用类型,不能使用值类型。
· 泛型的类型参数可以有多个。
· 泛型类不是真正存在的类,不能使用instanceof运算符。
· 泛型类的类型参数不能用在静态申明。
· 如果定义了泛型,不指定具体类型,泛型默认指定为Ojbect类型。
· 泛型使用?作为类型通配符,表示未知类型,可以匹配任何类型。因为是未知,所以无法添加元素。
· 类型通配符上限:<? extends T>,?代表是T类型本身或者是T的子类型。常用于泛型方法,避免类型转换。
· 类型通配符下限。<? super T>,?代表T类型本身或者是T的父类型。
· 除了通配符可以实现限制,类、接口和方法中定义的泛型参数也能限制上限和下限。
以String类型举例:
public class Student {
private T sex;
public T getSex() {
return sex;
}
public void setSex(T sex) {
this.sex = sex;
}
}
将泛型作为参数和返回值类型使用:
public class Test01 {
public static void main(String[] args) {
show(3.1);
System.out.println(getT(“abc”));
}
// T 我不知道是什么类型 , 使用泛型做为参数
public static void show(T t){
System.out.println(t.getClass());
}
public static T getT(T t){
return t;
}
}
泛型在定义的时候不具体,在使用的时候才变得具体,在使用的时候确定泛型的具体类型。
使用泛型:即什么时候确定泛型
在创建对象的时候确定泛型
含有泛型的方法:
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数) { }