泛型集合知识点整理
- 什么是泛型?
- 为什么要使用泛型?
- 泛型的特点
- 泛型类
- 泛型类的基本用法
- 继承情况
- 泛型类的细节
- 泛型方法
- 怎么定义一个泛型方法:
- 泛型方法可以是静态的吗?
什么是泛型?
泛型就相当于标签,集合容器在设计、声明阶段不能确定这个类型到底存的都是什么类型的对象,所有在jdk1.5之前只能把元素设计为Object类型,jdk1.5之后就采用泛型来解决了,即把元素的类型设计成一个参数,这个类型参数叫做泛型。比如:ArrayList,这个就是参数,即泛型。
为什么要使用泛型?
我们存数组的时候希望能够存储一组数据类型相同的数据,但是普通集合是什么类型都能放进去,不便于我们管理,所以我们要使用泛型来限制存进的数据类型。
泛型的特点
1,泛型只有jdk1.5之后才有。
2,泛型其实就是<>引起来的参数类型,这个参数类型在具体使用的时候才会确定具体的类型。
3,使用泛型之后,可以确定集合中存放的数据类型,在编译的时候能够检查出来。
4,使用泛型之后,方便了后续的遍历等操作。
5,泛型对应的数据类型只能是引用数据类型,不能是基本的数据类型。
6,jdk1.5的时候这样定义泛型: ArrayList list1 = new ArrayList();jdk1.7之后可以这样定义:ArrayList list1 = new ArrayList<>();后面的<>可以不写,称为:钻石运算符。
泛型类
泛型类的基本用法
泛型类的写法:
/**
* @param <E>
* GenericTest其实就是一个普通的类
* GenericTest<E>就是一个泛型类
* <>里面就是一个参数类型,但是这个类型不确定,相当于占位。
* 但这个类型一定是一个引用数据类型
*/
public class GenericTest<E> {
int age;
String name;
E sex;
public void add(E e){
System.out.println("======参数:======"+e);
}
}
class Test{
//这是程序的入口
public static void main(String[] args) {
//1,实例化的时候不指定泛型,那么默认泛型类型为Object类型。
GenericTest genericTest = new GenericTest();
genericTest.add(2);
//2,实例化的时候指定泛型====推荐使用,可以限制类型
GenericTest<Integer> genericTest1 = new GenericTest<>();
genericTest1.sex=20;
genericTest1.add(genericTest1.sex);
}
}
继承情况
情况一:父类指定泛型
class SubGener extends GenericTest<String>{
public static void main(String[] args) {
//父类指定泛型类型,子类不需要再次指定泛型类型,可以直接使用
SubGener subGener = new SubGener();
subGener.add("meng");
}
}
情况二:父类型不指定泛型类型
/**
* 如果父类型不指定泛型的类型,那么子类也是一个泛型类,这个E的类型可以再创建子类对象的时候确定
* @param <E>
*/
class SubGener2<E> extends GenericTest<E>{
public static void main(String[] args) {
SubGener2<Integer> subGener2 = new SubGener2<>();
subGener2.add(20);
}
}
泛型类的细节
1,泛型类可以定义多个泛型参数,如下:
public class GenericTest1<A,B,C> {
A name;
B age;
C pwd;
public void toShow(A a,B b,C c){
System.out.println("===参数==="+a+"\t"+b+"\t"+c);
}
}
2,泛型如果不被指定,则会被擦除,对应的类型默认为Object。
3,泛型中的静态方法不能使用类的泛型。
原因在于:static方法是在类对象创建之前执行的,那在执行static方法时,参数a并不能确定是什么类型,本来参数a是根据GenericTest1类创建实例对象的时候才能决定。
4,不能使用E[]数组的形式创建:
public void show(A a){
//A[] a = new a[10];
A[] i = (A[]) new Object[10];
}
泛型方法
怎么定义一个泛型方法:
方法作用域修饰符 <泛型类型> 返回值类型 方法名(泛型){
}
public class GenericTest2<E> {
//不是泛型方法
public void a(E e){
}
//是泛型方法
public <T> void b(T t){
}
}
泛型方法定义的时候,前面要加, 如果不加的话,会把T当做一种数据类型,而代码中没有这种参数类型,就会报错。而且泛型方法的泛型参数与泛型类的参数类型无关
泛型方法可以是静态的吗?
可以。因为静态方法优先于对象执行,泛型方法的参数与类无关,所以与对象的创建不创建也无关。但是泛型类里面的带泛型参数的方法就不能是静态的,因为参数类型要有泛型类实例的时候决定的。