10.【Java核心.泛型】常用的泛型书写语法及泛型所处的阶段

泛型:

​ 本质:参数化类型

泛型的擦除:

​ 泛型只在编译阶段有效,编译之后JVM会采取去泛型化的措施.

​ 泛型在运行阶段是没有效果

泛型通配符

1.无边界通配符

通用的类型
public class Demo02 {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("nick");
        list1.add("tom");
        list1.add("coco");
        loop(list1);
    }

    public static void loop(List<?> list){
        for (int i = 0; i < list.size() ; i++) {
            System.out.println(list.get(i));
        }
    }
}

2.上边界通配符

< ? extends Number > 代表从Number往下的子类或孙类对象都可以使用

public class Demo03 {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("nick");
        list1.add("tom");
        list1.add("coco");
        // loop(list1);
        List<Number> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(3);
    }

    /**
     *  ?  extends Number
     *  通用的类型必须是Number及其子类
     * @param list
     */
    public static void loop(List<? extends Number> list){
        for (int i = 0; i < list.size() ; i++) {
            System.out.println(list.get(i));
        }
    }
}

3.下边界通配符

代表从Integer 到Object所有的对象都可以
public class Demo04 {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("nick");
        list1.add("tom");
        list1.add("coco");
         loop(list1);
        List<Number> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(3);
        loop(list2);
    }

    /**
     *  ?  super Number
     *  通用类型必须是Integer 到Object类型的对象
     * @param list
     */
    public static void loop(List<? super Number> list){
        for (int i = 0; i < list.size() ; i++) {
            System.out.println(list.get(i));
        }
    }
}

泛型的具体的使用

规则

1.必须先声明再使用

2.泛型的声明是通过"<>"实现

3.约定泛型可以使用单个大写字母来表示 K E T V 等

泛型类

public class PersonNew <T> {

    private T t;

    public T getT() {
        return t;
    }

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

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

增加我们代码的灵活度

泛型方法

public class Demo07 <K,V> {

    /**
     * 普通方法 可以使用 类中定义的泛型
     * @param k
     * @param v
     * @return
     */
    public K method1(K k,V v){
        return (K)null;
    }

    /**
     * 普通方法  使用方法中定义的泛型
     * @param t
     * @param v
     * @param <T>
     * @return
     */
    public <T> T method2(T t,V v){
        return (T)null;
    }

    /**
     * 在静态方法中我们没法使用 类中定义的泛型
     * @return
     */
    public static <K> K method3(){
        return null;
    }

泛型接口

public interface CalGeneric <T> {

    T add(T a,T b);

    T sub(T a,T b);

    T mul(T a,T b);

    T div(T a,T b);
}
public class CalIntegerGeneric implements  CalGeneric<Integer> {
    @Override
    public Integer add(Integer a, Integer b) {
        return null;
    }

    @Override
    public Integer sub(Integer a, Integer b) {
        return null;
    }

    @Override
    public Integer mul(Integer a, Integer b) {
        return null;
    }

    @Override
    public Integer div(Integer a, Integer b) {
        return null;
    }
}

posted @ 2021-03-16 10:34  想~(●—●)肥~  阅读(97)  评论(0编辑  收藏  举报