自学内容网 自学内容网

Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)

泛型

21.1 概述

JDK5中引入的特性,在编译阶段约束操作的数据类型,并进行检查

泛型格式:<数据类型>

泛型只能支持引用数据类型,如果写基本数据类型需要写对应的包装类。

泛型好处:

  • 统一数据类型
  • 把运行时期的问题提到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

泛型细节:

  • 泛型中不能写基本数据类型

    因为基本数据类型不能转成Object类型,包装类才能转成Object类型

  • 指定泛型后传递数据时,可以传入该类类型或者其子类类型

  • 如果不写泛型,类型默认是Object

21.2 泛型类

使用场景:当一个类中,某个变量的数据类型不确定时,可以定义带有泛型的类。

格式:
  修饰符 class 类名<类型>{
    ....
  }

举例:
  E可以理解为变量,但不是变量,不是记录数据的,是用来记录数据类型的
  
  public class ArrayList<E>{
     //.....  当创建给类对象时,E就确定类型
  }
//自定义泛型类
public class MyArrayList<E>{
    Object[] obj = new Object[5];
    int size; // size:表示长度,即存了几个元素
  
    // E:表示不确定的类型
    // e:形参的名字,变量名
    // 添加元素
    public boolean add(E e){
        obj[size] = e;
        size++;
        return true;
    }
    // 获取元素
    public E get(int index){
        return (E) obj[index];
    }

    // 重写toString方法
    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}
==================================================
  public class Test {
    public static void main(String[] args) {
//创建自己定义泛型类的对象
        MyArrayList<String> list = new MyArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);
        //[aaa, bbb, ccc, null, null]

        String s = list.get(0);
        System.out.println(s);//aaa

        MyArrayList<Integer> list1 = new MyArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        Integer integer = list1.get(1);
        System.out.println(integer);//2
    }
}

21.3 泛型方法

方法中形参类型不确定时:

  • 方案1:使用类名后定义的泛型(如21.2中的add方法)

    在本类里所有方法都可以用

  • 方案2:在方法申明上定义自己的泛型

    只有本方法能用

格式:
  修饰符 <类型> 返回值类型 方法名(类型 变量名){
  
}
举例:
  public <T> void show(T t){
  // 调用该方法时,T才能确定类型
}
public class ListUtil {

    // 私有化构造方法,不让外界本类的对象
    private ListUtil(){}

// 类中定义静态方法addAll, 用来添加多个集合的元素
//public static <E> void addAll(ArrayList<E> list,E e1,E e2){
    //     list.add(e1);
    //     list.add(e2);
    // }
  
   //可变参数 E...e
   public static <E> void addAll(ArrayList<E> list,E...e){
        for (E element : e) {
            list.add(element);
        }
    }
  
    public void show(){
        System.out.println("这是自定义工具类....");
    }

}
==========================================
  public class Test {
    public static void main(String[] args) {

        // 在创建对象时,就可以确定泛型方法的形参类型
        ArrayList<String> list = new ArrayList<>();
        ListUtil.addAll(list,"6","8");
        System.out.println(list);//[6, 8]

        ArrayList<Integer> list2 = new ArrayList<>();
        ListUtil.addAll(list2,5,1);
        System.out.println(list2);//[5, 1]
    }
}

21.4 泛型接口

格式:
  修饰符 interface 接口名<类型>{
  
}

举例:
  public interface List<E>{
  
}


泛型接口的两种使用方式:
     1.实现类给出具体的类型
     2.实现类延续泛型,创建实现类对象时再确定类型

// 1.实现类给出具体的类型,实现List接口
public class MyArrayList2 implements List<String> {
  // 省略重写List里的抽象方法
}
==================================================
  public class Test {
    public static void main(String[] args) {
       //MyArrayList集合中只能存字符串,
       //创建MyArrayList对象时不用指定泛型
        MyArrayList list = new MyArrayList();
        list.add("666");
    }
}
// 2.实现类延续泛型,创建实现类对象时再确定类型
public class MyArrayList02<E> implements List<E> {
  // 省略重写List里的抽象方法
}
==================================================
  public class Test02 {
    public static void main(String[] args) {
        // 2.实现类延续泛型,创建实现类对象时再确定类型
        MyArrayList02<Integer> list = new MyArrayList02<>();
        list.add(6);
    }
}

原文地址:https://blog.csdn.net/weixin_54555405/article/details/142315348

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!