码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java的<? super T>和<? extends R>理解与应用


    记录:293

    场景:Java的和理解与应用。:表示?匹配的类型都是T的父类,包括T本身。:表示?匹配的类型都是类型R的子类,包括R本身。

    版本:

    1. JDK 1.8
    2. Spring Boot 2.6.3

    一、基础

    1.对和理解

    对和理解,就是对泛型的理解。

    1.1 概念理解

    :表示?匹配的类型都是T的父类,包括T本身。

    :表示?匹配的类型都是类型R的子类,包括R本身。

    1.2 使用List协助理解

    1.2.1 List

    List list:表示集合中存放的都是R的子类(包括R本身)。

    针对变量List list。

    (1)对List做添加(add(R))操作,必须使用R或者R的子类添加到list中。

    (2)对List做遍历查询操作,必须使用R遍历list,取出元素.

    小结:拿到一个变量使用? extends R修饰时,应该是对该变量做查询或取元素操作,不做添加操作。这种方式修饰叫做get原则。

    1.2.2 List<? super T>

    List list:表示集合中存放的都是T的父类(包括T本身)。

    针对变量List list。

    (1)对List做添加(add(T))操作,必须使用T或者T的子类添加到list中。

    (2)对List做遍历查询操作,必须使用T父类去遍历list,取出元素。

    小结:拿到一个变量使用? super T修饰时,应该是对该变量做添加操作,不做查询操作。这种方式修饰叫做put原则。

    二、应用

    应用实例来理解:List和List。

    1.应用List

    1.1 应用说明

    Obj0101是Obj01的子类。

    (1)在List list中存放的是Obj01的所有子类(包括Obj01自身)。

    (2)f1_1函数的入参是List list,在f1_1函数中,对变量list添加元素会报错,无法确定是哪个子类,因为list存放的任何Obj01子类。

    (3)在f1_1函数中,可以对变量list使用Obj01类型取出元素,因为list中的元素都是Obj01的子类(包括Obj01自身)。

    (4)在f1_1函数中,针对修饰的变量List,可以读取元素不能添加元素,也被叫做Get原则。

    (5)小结:在函数中使用修饰的变量list。

        添加操作:添加元素类型必须是Obj01子类或者自身。比如本例添加子类Obj0101,在f1_1函数之外操作。

        获取操作:获取元素必须遍历List或者List,在f1_1函数中操作。

    先对List list做添加操作,再把值传递给f1_1函数。

    1.2 应用实例

    应用实例,验证。

    1. /**
    2. * 给List修饰的变量传值
    3. * List:表示集合中存放的都是R的子类
    4. */
    5. public static void f1() {
    6. // 子类
    7. List list = new ArrayList<>();
    8. list.add(new Obj0101("张一"));
    9. list.add(new Obj0101("王二"));
    10. f1_1(list);
    11. // 自身
    12. List list2 = new ArrayList<>();
    13. list2.add(new Obj01());
    14. f1_1(list2);
    15. }
    16. /**
    17. * 1.在List list中存放的是Obj01的所有子类(包括Obj01自身)。
    18. * 2.f1_1函数的入参是List list,在f1_1函数中,对变量list添加元素会报错,无法确定是哪个子类,因为list存放的任何Obj01子类。
    19. * 3.在f1_1函数中,可以对变量list使用Obj01类型取出元素,因为list中的元素都是Obj01的子类(包括Obj01自身)。
    20. * 4.针对修饰的变量List,可以读取元素不能添加元素,也被叫做Get原则。
    21. * 5.小结: 在函数中使用修饰的变量list,
    22. * 添加操作:添加元素类型必须是Obj01子类或者自身。比如本例添加子类Obj0101。
    23. * 获取操作:获取元素必须遍历List或者List。
    24. */
    25. public static void f1_1(List list) {
    26. for (Obj01 var : list) {
    27. var.getGirl();
    28. }
    29. for (Object var : list) {
    30. Obj01 obj01 = (Obj01) var;
    31. obj01.getGirl();
    32. }
    33. }
    34. 2.应用List>

      2.1 应用说明

      Obj0201和Obj0202是Obj02的子类。

      (1)在List list存放的都是Obj0201的父类(包括自身)

      (2)在f2_1函数的入参是List list,在在f1_2函数,对变量list添加Obj0201的子类(包括Obj0201自身)可以的。

      (3)在f2_1函数中,对变量变量List list,使用Obj0201或者Obj0201子类取出元素是不行的,会报错,无法确定具体取出的是那种类型。

      (4))在f2_1函数中,针对修饰的变量list,可以添加元素不能读取元素,也被叫做Put原则。

      (5)总结:

          添加操作:添加元素类型必须是Obj0201子类或者自身,在f2_1函数之中操作。

      获取操作:获取元素必须遍历List或者List,在f2_1函数之外操作。

      先定义一个满足List list类型的变量,再把值传递给f2_1函数,在f2_1函数中做添加操作。

      2.2 应用实例

      应用实例,验证。

      1. /**
      2. * 给List修饰的变量传值
      3. * ListList:表示集合中存放的都是T的父类
      4. */
      5. public static void f2() {
      6. List list = new ArrayList<>();
      7. Listsuper Obj0201> list2 = f2_1(list);
      8. for (Obj02 var : list) {
      9. var.getGirl();
      10. }
      11. }
      12. /**
      13. * (1)在List list存放的都是Obj0201的父类(包括自身)
      14. * (2)在f2_1函数的入参是List list,在在f1_2函数,对变量list添加Obj0201的子类(包括Obj0201自身)可以的。
      15. * (3)在f2_1函数中,对变量变量List list,使用Obj0201或者Obj0201子类取出元素是不行的,会报错,无法确定具体取出的是那种类型。
      16. * (4))在f2_1函数中,针对修饰的变量list,可以添加元素不能读取元素,也被叫做Put原则。
      17. * (5)总结:
      18. * 添加操作:添加元素类型必须是Obj0201子类或者自身,在f2_1函数之中操作。
      19. * 获取操作:获取元素必须遍历List或者List,在f2_1函数之外操作。
      20. * 先定义一个满足List list类型的变量,再把值传递给f2_1函数,在f2_1函数中做添加操作。
      21. */
      22. public static Listsuper Obj0201> f2_1(Listsuper Obj0201> list) {
      23. list.add(new Obj0201("刘五"));
      24. list.add(new Obj0201("陈六"));
      25. list.add(new Obj0202("赵七"));
      26. list.add(new Obj0202("张八"));
      27. return list;
      28. }
      29. 3.应用对象

        3.1 Obj01基类

        1. public static class Obj01 {
        2. public Obj01() {
        3. }
        4. public void getGirl() {
        5. }
        6. }

        3.2 Obj0101是Obj01子类

        1. public static class Obj0101 extends Obj01 {
        2. private String name;
        3. public Obj0101(String name) {
        4. this.name = name;
        5. }
        6. @Override
        7. public void getGirl() {
        8. System.out.println(this.name + ",真漂亮.");
        9. }
        10. }

        3.3 Obj02基类

        1. public static class Obj02 {
        2. private String name;
        3. public Obj02(String name) {
        4. this.name = name;
        5. }
        6. public void getGirl() {
        7. System.out.println(this.name + ",真漂亮.");
        8. }
        9. }

        3.4 Obj0201是Obj02子类

        1. public static class Obj0201 extends Obj02 {
        2. public Obj0201(String name) {
        3. super(name);
        4. }
        5. }

        3.5 Obj0202是Obj0201子类

        1. public static class Obj0202 extends Obj0201 {
        2. public Obj0202(String name) {
        3. super(name);
        4. }
        5. }

        以上,感谢。

        2022年8月21日

      30. 相关阅读:
        快速搭建 SpringCloud Alibaba Nacos 配置中心!
        一些常见的排序的集合
        linux系统设置密钥登录
        【M malloc送书第二期】朋友圈大佬都去读研了,这份备考书单我码住了!
        ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统
        论文笔记:Skeleton Key: Image Captioning by Skeleton-Attribute Decomposition
        vue3 一个基于pinia简单易懂的系统权限管理实现方案,vue-router动态路由异步问题解决
        【Linux指令集】---git命令的基本使用
        【从0开始配置前后端项目】——Docker环境配置
        tomcat到底是干嘛的?
      31. 原文地址:https://blog.csdn.net/zhangbeizhen18/article/details/126457554
        • 最新文章
        • 攻防演习之三天拿下官网站群
          数据安全治理学习——前期安全规划和安全管理体系建设
          企业安全 | 企业内一次钓鱼演练准备过程
          内网渗透测试 | Kerberos协议及其部分攻击手法
          0day的产生 | 不懂代码的"代码审计"
          安装scrcpy-client模块av模块异常,环境问题解决方案
          leetcode hot100【LeetCode 279. 完全平方数】java实现
          OpenWrt下安装Mosquitto
          AnatoMask论文汇总
          【AI日记】24.11.01 LangChain、openai api和github copilot
        • 热门文章
        • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
          奉劝各位学弟学妹们,该打造你的技术影响力了!
          五年了,我在 CSDN 的两个一百万。
          Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
          面试官都震惊,你这网络基础可以啊!
          你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
          心情不好的时候,用 Python 画棵樱花树送给自己吧
          通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
          13 万字 C 语言从入门到精通保姆级教程2021 年版
          10行代码集2000张美女图,Python爬虫120例,再上征途
        Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
        正则表达式工具 cron表达式工具 密码生成工具

        京公网安备 11010502049817号