泛型 generic

翟奇
2023-12-01

泛型generic

概述

本质是参数化类型,把类型作为参数传递

常见的使用类型:泛型类,泛型接口,泛型方法

语法:< T> T 称为类型占位符,表示一种引用类型

好处:提高代码的重用性

​ 防止类型转换异常,提高代码的安全性

 List al = new ArrayList();
 //添加元素
al.add("a");
al.add("b");
al.add("c");
al.add(100);
//遍历集合
for (int i = 0;  i<al.size() ; i++) {
    String s = (String) al.get(i);
    System.out.println(al.get(i));
}

此代码会报错ClassCastException,如果声明集合时规定泛型

List<String> al = new ArrayList();

则,在编译时就会报错,al.add(100),100为Integer类型。

泛型类

创建:

语法:类名后面加。<>里面写占位符,可以写多个,用逗号隔开。

T是类型占位符,表示一种引用类型。

public class demo1 <T>{}
  1. 创建变量

  2. 作为方法的参数

  3. 作为方法的返回值

    //创建变量
    T t;
    //泛型作为方法的参数使用
    public void show(T t){
        System.out.println(t);
    }
    //泛型作为方法的返回值使用
    public T show2(){
        return t;
    }
    

因为T作为泛型,具体类型未知,所以不能用来创建对象

//不能使用 T t = new T();

使用:

public static void main(String[] args) {
    //使用泛型类创建对象
    //创建对象时传入类型的参数<String>,不传入则后面不会规定t必须为String类型
    Demo1<String> demo1 = new Demo1<String>();
    demo1.t = "hello";
    demo1.show("你好");
    String str = demo1.show2();
    
    //创建对象时传入类型的参数<Integer>
    Demo1<Integer> demo2 = new Demo1<Integer>();
    demo2.t = 100;
    demo2.show(200);
    Integer integer = demo2.show2();
}

注意

泛型只能是引用类型

不同的泛型对象不能相互赋值

泛型接口

创建接口:

语法:接口名后面加<>

接口中可以写抽象方法和静态常量(默认由public static final修饰)

不能使用泛型创建静态常量

public interface Demo2<T> {
    //泛型接口interface
    //创建一个静态常量
    //T t;不能使用泛型创建静态常量
    String s="interface";
    //用泛型创建一个抽象方法
    T show(T t);
}

创建实现类

实现类为普通类

implements接口后面要写具体的类型。

implements Demo2<String>

public class Demo2impl implements Demo2<String> {

    @Override
    public String show(String s) {
        System.out.println(s);
        return s;
    }
}

使用:

Demo2impl demo2impl = new Demo2impl();
demo2impl.show("hello");

实现类也为泛型类

public class Demo2impl2<T> implements Demo2<T> {
    @Override
    public T show(T t) {
        System.out.println(t);
        return t;
    }
}

实现类类名后面的与接口名之后的是同一个类型

方法重写的返回类型也为T

T的具体类型在创建类对象new 时具体写

使用:

Demo2impl2<String> demo2impl2 = new Demo2impl2<String>();
demo2impl2.show("hello java");

泛型方法

语法:与泛型类和泛型接口不同 要放在方法返回类型前面

+返回值类型 的作用域仅在方法体内

创建:

//创建一个泛型方法
public <T>T method(T t){
    System.out.println(t);
    return null;
}

使用

Demo3 demo3 = new Demo3();
demo3.method(800);//T自动变为int
demo3.method("hello world");//T自动变为String
demo3.method(3.14);//T自动变为double

泛型的好处

  1. 提高重用性,例如在泛型方法中,要实现以下程序,要方法重载,method方法要写三遍,用泛型之后 写一遍就行。用一个方法就可以传递任何类型的数据

    Demo3 demo3 = new Demo3();
    demo3.method(800);//T自动变为int
    demo3.method("hello world");//T自动变为String
    demo3.method(3.14);//T自动变为double

  2. 防止类型转换异常,提高代码安全性。

泛型集合

泛型在集合中的使用

概念:参数化类型,类型安全的集合,强制集合元素的类型必须一致。

特点:编译时即可检查,而非运行时抛出异常

访问时不用类型转换

不同泛型之间引用不能相互赋值,泛型不存在多态。

 类似资料: