泛型强化

赖卓成2022年8月31日
大约 2 分钟

B站黑马教程:点击跳转

p1-概述

java推出泛型钱,List<Object> list,可以存储任意类型对象,但是在使用过程中,需要明确知道数据类型,不然会发生类型转换异常。而且,编译期间不会报错,是运行时出现异常。

代码:

public class MainClass {

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("hello");
        list.add(1);
        list.add(true);

        for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            String str = (String) o;
            System.out.println(str);
        }
    }
}

不使用泛型,发生类型转换异常

JDK5引入新特性,泛型在编译时安全检测,可以检测非法的类型。

泛型的本质就是参数类型化,操作的数据类型被指定为一个参数,否则则在编译期间就报错了。

采用泛型

总结:

  • 编译期间检查类型
  • 减少数据类型转换
p2-泛型类

泛型定义语法

class ClassName <T,E,...>{
    private T t;
    ...
}

常用泛型标识:T、E、K、V

demo

/**
 * 泛型类
 * @param <T> 泛型参数,在创建对象时指定,由外部使用类时指定
 * @author lzc
 * @date 2022/08/30
 */
public class Generic<T> {

    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public Generic(T t) {
        this.t = t;
    }

    @Override
    public String toString() {
        return "Generic{" +
            "t=" + t +
            '}';
    }

}

    public static void main(String[] args) {
        Generic<String> generic = new Generic<>("hello");
        String t = generic.getT();
        System.out.println(t);
        generic.setT("world");
        System.out.println(generic.getT());
    }

泛型类使用

最大的有点就是代码复用、减少类型转换。如果不指定泛型,默认是Object,不支持基本数据类型。

同一泛型类,根据不同数据类型创建的对象,本质上是同一类型:

    public static void main(String[] args) {
        Generic<String> stringGeneric = new Generic<>("hello");
        Generic<Integer> integerGeneric = new Generic<>(1);

        System.out.println("stringGeneric.getClass() = " + stringGeneric.getClass());
        System.out.println("integerGeneric.getClass() = " + integerGeneric.getClass());
        System.out.println(stringGeneric.getClass() == integerGeneric.getClass());
    }

image-20220830203637046

p3-泛型类的使用
/**
 * 抽奖,泛型类。包含奖品、奖品池、随机抽取
 *
 * @author lzc
 * @date 2022/08/30
 */
public class ProductGetter<T> {

    private Random random = new Random();

    /**
     * 奖品
     */
    private T product;

    /**
     * 奖品池
     */
    private ArrayList<T> list = new ArrayList<T>();

    /**
     * 获取奖品
     *
     * @return {@link T}
     */
    public T getProduct() {
        T t = list.get(random.nextInt(list.size()));
        product = t;
        return product;
    }


    /**
     * 设置奖品池
     *
     * @param list 列表
     */
    public void setList(ArrayList<T> list) {
        this.list = list;
    }
}

    public static void main(String[] args) {
        ProductGetter<String> stringProductGetter = new ProductGetter<>();
        ArrayList<String> strings = new ArrayList<>();
        String[] strArray = {"苹果手机","华为手机","小米手机"};
        strings.addAll(List.of(strArray));
        stringProductGetter.setList(strings);
        System.out.println("恭喜抽到:" + stringProductGetter.getProduct());

        ProductGetter<Integer> integerProductGetter = new ProductGetter<>();
        ArrayList<Integer> integers = new ArrayList<>();
        integers.addAll(List.of(100,200,300,400,500,600,700,800,900,1000));
        integerProductGetter.setList(integers);
        System.out.println("恭喜抽到:" + integerProductGetter.getProduct()+"元");

    }

image-20220830223449981

p4-泛型类派生子类
  • 子类也是泛型类,子类和父类的泛型类型要一致

    class ChildGeneric<T> extends Generic<T>
    
  • 子类不是泛型类,父类要明确泛型的数据类型

    class ChildGeneric extends Generic<String>
    
Loading...