泛型集合知识点整理

  • 什么是泛型?
  • 为什么要使用泛型?
  • 泛型的特点
  • 泛型类
  • 泛型类的基本用法
  • 继承情况
  • 泛型类的细节
  • 泛型方法
  • 怎么定义一个泛型方法:
  • 泛型方法可以是静态的吗?


什么是泛型?

        泛型就相当于标签,集合容器在设计、声明阶段不能确定这个类型到底存的都是什么类型的对象,所有在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");
    }
}

java list泛型如何使用 list泛型参数_集合


        情况二:父类型不指定泛型类型

/**
 * 如果父类型不指定泛型的类型,那么子类也是一个泛型类,这个E的类型可以再创建子类对象的时候确定
 * @param <E>
 */
class SubGener2<E> extends GenericTest<E>{
    public static void main(String[] args) {
        SubGener2<Integer> subGener2 = new SubGener2<>();
        subGener2.add(20);
    }
}

java list泛型如何使用 list泛型参数_编程语言_02

泛型类的细节

        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,泛型中的静态方法不能使用类的泛型。

java list泛型如何使用 list泛型参数_java_03


        原因在于: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当做一种数据类型,而代码中没有这种参数类型,就会报错。而且泛型方法的泛型参数与泛型类的参数类型无关

泛型方法可以是静态的吗?

        可以。因为静态方法优先于对象执行,泛型方法的参数与类无关,所以与对象的创建不创建也无关。但是泛型类里面的带泛型参数的方法就不能是静态的,因为参数类型要有泛型类实例的时候决定的。