JavaSE——泛型、自定义泛型、泛型通配符、上下限

发布时间 2023-03-22 21:13:31作者: SuzukiHane

泛型

泛型概述

  • 泛型的介绍

    泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

  • 泛型的好处

    1. 把运行时期的问题提前到了编译期间

    2. 避免了强制类型转换

  • 泛型的定义格式

    • <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如: <E> <T>

    • <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如: <E,T> <K,V>

 

泛型类

package com.zhao.genericity_class;

import java.util.ArrayList;

public class MyArrayList<E> {
    private ArrayList arrayList=new ArrayList();
    public void add(E e){
        arrayList.add(e);
    }

    public void remove(E e){
        arrayList.remove(e);
    }

    @Override
    public String toString() {
        return arrayList.toString();
    }
}
package com.zhao.genericity_class;

public class Test {
    //需求:模拟ArrayList定义一个MyArrayList,但只需要关注泛型设计增加删除操作
    public static void main(String[] args) {
        MyArrayList<String> list=new MyArrayList<>();
        list.add("aaa");
        list.add("张三");
        list.add("MySQL");
        //list.add(123);报错,约定好了泛型类
        System.out.println(list);
        list.remove("MySQL");
        System.out.println(list);

        MyArrayList<Integer> list2=new MyArrayList<>();
        list2.add(111);
        list2.add(222);
        list2.add(333);
        //list2.add("张三");报错,约定好了泛型类
        System.out.println(list2);
        list2.remove(333);
        System.out.println(list2);
    }

}

泛型方法

package com.zhao.genericity_method;

public class GenericityDemo {
    public static void main(String[] args) {
        String[] names={"张三","李四","王五"};
        //调用泛型打印方法
        printArray(names);

        Integer[] ages={18,20,25};
        printArray(ages);
    }

    //用泛型方法用于接任意类型的元素写一个打印数组内容的方法
    public static <T> void printArray(T[] arr){
        if (arr!=null){
            StringBuilder sb=new StringBuilder();
            sb.append("[");
            for (int i = 0; i < arr.length; i++) {
                //用三元运算符连续拼接除了最后一个元素之间的逗号
                sb.append(arr[i]).append(arr.length-1==i?"":",");
            }
            sb.append("]");
            System.out.println(sb);
        }else {
            //如果数组内存的是null那就直接输出
            System.out.println(arr);
        }
    }
}

 

泛型接口

重点在于写法,省略了对象类的内容

package com.zhao.genericity_interface;

public class Student {
}
package com.zhao.genericity_interface;

public class Teacher {
}
package com.zhao.genericity_interface;

public interface Data<E> {
    void add(E e);
    void delete(int id);
    void update(E e);
    void queryById(int id);
}
package com.zhao.genericity_interface;

public class StudentData implements Data<Student>{

    @Override
    public void add(Student student) {

    }

    @Override
    public void delete(int id) {

    }

    @Override
    public void update(Student student) {

    }

    @Override
    public void queryById(int id) {

    }
}
package com.zhao.genericity_interface;

public class TeacherData implements Data<Teacher>{

    @Override
    public void add(Teacher teacher) {

    }

    @Override
    public void delete(int id) {

    }

    @Override
    public void update(Teacher teacher) {

    }

    @Override
    public void queryById(int id) {

    }
}

 

泛型通配符<?>与其上下限

package com.zhao.genericity_limit;

public class Car {
}
package com.zhao.genericity_limit;

public class BENZ extends Car{
}
package com.zhao.genericity_limit;

public class BMW extends Car{
}
package com.zhao.genericity_limit;

import com.zhao.genericity_interface.Data;

import java.util.ArrayList;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<BENZ> list1=new ArrayList<>();
        list1.add(new BENZ());
        list1.add(new BENZ());
        list1.add(new BENZ());
        go(list1);

        ArrayList<BMW> list2=new ArrayList<>();
        list2.add(new BMW());
        list2.add(new BMW());
        list2.add(new BMW());
        go(list2);

        /*ArrayList<Dog> list3=new ArrayList<>();
        list3.add(new Dog());
        list3.add(new Dog());
        list3.add(new Dog());
        go(list3);*/
        //如果直接用泛型通配符<?>的话会将Dog也传进汽车队伍里
    }

    //所有车比赛

    /*
    ArrayList<Car>虽然是ArrayList<BMW>和ArrayList<BENZ>的父类,但是它们是三个完全独立的集合
    public static void go(ArrayList<Car> cars){
        System.out.println("开始比赛");
    }*/

    /*public static void go(ArrayList<?> cars){
        System.out.println("开始比赛");
    }*/

    /*
    泛型的上下限:
    ?extends Car  必须是Car或其子类 泛型上限
    ?super Car 必须是Car或其父类 泛型下限
     */
    public static void go(ArrayList<?extends Car> cars){
        System.out.println("开始比赛");
    }
}