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

Posted javaHane

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE——泛型自定义泛型泛型通配符上下限相关的知识,希望对你有一定的参考价值。

泛型

泛型概述

  • 泛型的介绍

    泛型是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("开始比赛");
    

 

以上是关于JavaSE——泛型自定义泛型泛型通配符上下限的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础知识点 笔记总结

Java 基础知识点 笔记总结

Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

JAVASE(十五) 泛型 :泛型用例自定义泛型类通配符

Collection泛型