• Java回顾-泛型


    一、为什么用泛型

    1. 解决元素存储的安全性问题, 好比商品、 药品标签, 不会弄错。

    2. 解决获取数据元素时, 需要类型强制转换的问题, 好比不用每回拿商品、 药品都要辨别。

             在集合中使用泛型的例子:

    ArrayList<Integer> list = new ArrayList<>();

     二、自定义泛型

    1.自定义泛型类/接口

            1、在自定义class中也可以使用泛型,但实例化时一般要指明类的泛型

            2、static 方法中不能使用类的泛型,因为Static方法加载实例化得早。

            3、异常类不能是泛型的

            4、不能使用new E[ ]。但是可以: E[ ] elements = ( E[ ] )new Object[i];

            5、若父类有泛型,则子类可以选择保留泛型也可以选择指定泛型类型。子类除了指定或保留父类的泛型,还可以增加自己的泛型。

    1. //自定义泛型类
    2. class order<T>{
    3. private T orderT;
    4. private String desc;
    5. public order(T orderT, String desc) {
    6. this.orderT = orderT;
    7. this.desc = desc;
    8. }
    9. ... ...
    10. }
    11. //子类保留泛型
    12. class subOrder extends order1<String>{
    13. public subOrder(String orderT, String desc) {
    14. super(orderT, desc);
    15. }
    16. }
    17. //子类增加泛型
    18. class subOrder1<A> extends order{
    19. public subOrder1(A orderA, String desc) {
    20. super(orderA, desc);
    21. }
    22. }

    2.自定义泛型方法

            -泛型方法的泛型参数与的泛型参数没有关系。其所属类不一定非要是泛型类

            -泛型方法在调用时指定泛型参数的类型

            -泛型方法可以声明为static的,因为泛型参数是在调用方法时确定的,而非实例化时确定。

             格式:[访问权限] 返回类型 方法名([泛型标识 参数名称]) 抛出的异常

    1. class subOrder1<A> extends order1{
    2. public subOrder1(A orderA, String desc) {
    3. super(orderA, desc);
    4. }
    5. public <T> List<T> GenericMethod(T list){
    6. System.out.println("这是泛型方法");
    7. return null;
    8. }
    9. }

    三、泛型继承性的体现

            如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明接口G<B>并不是G<A>子类型! 比如:StringObject的子类,但是List<String>并不是List<Object>的子类。它们并列关系

            -若A是B的父类,则A<G> 是 B<G> 的父类,如 List<String> 与 ArrayList<String>

     四、通配符

    1、通配符的使用

            通配符:?

            A是B的父类,G<A>和 G<B> 没有关系,二者共同的父类是:G <?>

                    例如:List<?>List<String>List<Integer>等各种泛型List的父类

            对于G<?>,不能向其内部添加数据,除了null;允许读取数据,数据类型为Object

    2、有限制条件的通配符的使用

            1.<?>允许所有泛型的引用调用

            2.通配符指定上限

                    上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<=

                             <? extends A> (无穷小 , A]       只允许泛型为 A 及 A 的子类的引用调用

            3.通配符指定下限

                    下限super:使用时指定的类型不能小于操作的类,即>=

                             <? super A>  [A , 无穷大)         只允许泛型为 A 及 A 父类的引用调用

            

             <? extends Comparable>        只允许泛型为实现Comparable接口的实现类的引用调用

    3、注意点

     

  • 相关阅读:
    解决pycharm中PIL安装失败
    fiddler的使用
    云计算项目十一:构建完整的日志分析平台
    如何将Mysql数据库的表导出并导入到另外的架构
    1、Git相关操作
    【数据结构】队列的顺序表实现&&收尾栈和队列
    Android Compose 一:基础控件
    高可用Kuberbetes部署Prometheus + Grafana
    一文了解深度学习实战——分类篇
    增长放缓,产业内卷,扫地机器人下一步会走向哪里?
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/125474314