Mybatis源码解析:Java泛型详解

2023-05-16

注意:①泛型的类型参数只能是类类型,不能是基本属性类型;②不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。if(ex_num instanceof Generic<Number>){ }

4.2 泛型接口


泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生成器(专门负责创建对象的类)中,一个生成器一般只定义一个next方法,用于产生新的对象。可以看一个例子:


//定义一个泛型接口

public interface Generator<T> {

    public T next();

} 

当实现泛型接口的类,未传入泛型实参时:


/**

 * 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中

 * 即:class FruitGenerator<T> implements Generator<T>{

 * 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"

 */

class Generator<T> implements Generator<T>{

    @Override

    public T next() {

        return null;

    }

} 

当实现泛型接口的类,传入泛型实参时:


/**

 * 传入泛型实参时:

 * 定义一个生成器实现这个接口,虽然只创建了一个泛型接口Generator<T>

 * 但是可以为T传入无数个实参,形成无数种类型的Generator接口。

 * 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型

 * 即:Generator<T>,public T next();中的的T都要替换成传入 的String类型。

 */

public class Generator implements Generator<String> {

    private String[] fruits = new String[]{"Apple", "Banana", "Pear"};

    @Override

    public String next() {

        Random rand = new Random();

        return fruits[rand.nextInt(3)];

    }

} 

4.3 泛型方法


上面介绍了泛型类,还可以定义带有参数类型的方法,即泛型方法。定义泛型方法,只需要将泛型参数列表置于方法返回值之前,就像下面:


/**

 *    1)泛型参数<T> 可以理解为声明此方法为泛型方法

 *    2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。

 * 	  3)泛型的数量也可以为任意多个

 */

public class GenericMethods { 

	public <T> void f(T x) {

		System.out.println(x.getClass.getName());

	}

	

	public static void main(sring[] args) {

		GenericMethods gm = new GenericMethods();

		gm.f("");//java.lang.String

		gm.f(1);//java.lang.Integer

		gm.f(1.0);//java.lang.Double

		gm.f('a');//java.lang.Character

		gm.f(gm);//GenericMethods

	}

} 

  • 使用泛型类时必须在创建对象时指定类型参数的值,而使用泛型方法时通常不必指明类型参数 。因为编译器会我们找出具体的类型,可以向调用普通方法一样调用泛型方法。

  • 泛型方法使得方法能独立于类而产生变化,无论何时,如果你能做到,你就该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该使用泛型方法.

4.3.1 泛型方法与可变参数

泛型方法与可变参数列表能够很好的共存:


public class GenericTest {

	//使用可变参数的泛型方法

    public static <T> void printMsg(T... args) {

        for (T t :args) {

            System.out.print(t + " ");

        }

    }



    public static void main(String[] args) {

        GenericTest.printMsg("111", 222, 'A', 100.000);

    }

} 

4.3.2 静态方法与泛型

静态方法有一种情况需要注意一下,那就是在类中的静态方法使用泛型:静态方法不能使用泛型类的类型参数;如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。


public class StaticGenerator<T> {

    ....

    /**

     * 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明(将这个方法定义成泛型方法)

     * 即使静态方法要使用泛型类中已经声明过的泛型也不可以。

     * 如:public static void show(T t){..},此时编译器会提示错误信息:

          "StaticGenerator cannot be refrenced from static context"

     */

    public static <T> void show(T t){



    }

} 

4.3.3 泛型方法总结

  • 泛型方法可以在普通类中定义,也可以在泛型类中定义

  • 无论何时,如果你能做到,你就该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该使用泛型方法.

  • static修饰的方法无法访问泛型类的类型参数。所以如果static方法需要使用泛型能力,就必须使其成为泛型方法。

  • 在泛型方法中出现了泛型的结构,泛型参数与类的泛型参数没任何关系。即泛型方法所属的类是不是泛型类都没关系。

4.4 泛型注意点


在这里插入图片描述

4.5 类型通配符


  • 泛型在继承方面的体现:类A是类B的父类,但是G <A>G<B>二者不具备子父类关系,二者是并列关系【补充:类A是类B的父类,A<G>B<G> 的父类】。因此需要一个在逻辑上可以用来表示同时是G <A>G<B>的父类的一个引用类型,由此,类型通配符应运而生。

  • 类型通配符一般是使用 ? 代替具体的类型实参,G <A>G<B>二者的共同父类是G<?>


@Test

    public void test(){

    	List<Object> list1 = null;

      	List<String> list2 = null;

      	List<?> list = null;

	

     	list = list1;

     	list = list2;

      	//编译通过

		// print(list1);

		// print(list2);

      

      List<String> list3 = new ArrayList<>();

      list3.add("AA");

      list3.add("BB");

      list3.add("CC");

      list = list3;

      //添加(写入):对于List<?>就不能向其内部添加数据。(除了添加null之外)

	// list.add("DD");错误

	// list.add('?');错误

      list.add(null);



      //获取(读取):允许读取数据,读取的数据类型为Object。

      Object o = list.get(0);

      System.out.println(o);

    }



    public void print(List<?> list){

        Iterator<?> iterator = list.iterator();

        while(iterator.hasNext()){

            Object obj = iterator.next();

            System.out.println(obj);

        }

    } 

  • 涉及通配符的集合的数据的写入和读取:

    • 添加(写入):对于List<?>不能向其内部添加数据。(除了添加null之外)

    • 获取(读取):允许读取数据,读取的数据类型为Object。

有限制的通配符

  • 类型通配符下限 :? extends A

    • G<? extends A> 可以作为G<A>G<B>的父类,其中B是A的子类
  • 类型通配符上限:? super A

    • G<? super A> 可以作为G<A>G<B>的父类,其中B是A的父类

**类比数学中的区间:

?相当于(-∞,+∞);? extends A——(-∞,A];? super A——[A,+∞)**


 */

    @Test

    public void test2(){

        List<? extends Person> list1 = null;

        List<? super Person> list2 = null;



# 惊喜

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

![image.png](https://img-blog.csdnimg.cn/img_convert/a2f6f9cda63f0e1b601d8a25895dd31a.png)


![image.png](https://img-blog.csdnimg.cn/img_convert/c3838a44e11db29168828428e1106450.png)

区间:  

> ?相当于(-∞,+∞);? extends A——(-∞,A\];? super A——\[A,+∞)**



*/

@Test

public void test2(){

    List<? extends Person> list1 = null;

    List<? super Person> list2 = null;

惊喜

最后还准备了一套上面资料对应的面试题(有答案哦)和面试时的高频面试算法题(如果面试准备时间不够,那么集中把这些算法题做完即可,命中率高达85%+)

[外链图片转存中…(img-9Ty5iBNz-1628078977787)]

[外链图片转存中…(img-Idv2Ugww-1628078977789)]

资料获取方式:戳这里免费领取

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis源码解析:Java泛型详解 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐

  • 【C++软件开发】Linux相关面试题型

    一 xff1a Linux的I O模型介绍以及同步异步阻塞非阻塞的区别 xff08 超级重要 xff09 xff08 IO过程包括两个阶段 xff1a xff08 1 xff09 内核从IO设备读写数据和 xff08 2 xff09 进程从
  • 【C++】 STL详解

    目录 一 xff1a 泛型编程 二 xff1a 什么是STL 三 xff1a STL发展 四 xff1a STL组件 五 xff1a 容器 六 xff1a 类型成员 七 xff1a 适配器 八 xff1a 迭代器 九 xff1a 算法 十
  • 12.STM32freeRTOS---递归互斥信号量

    文章目录 前言一 创建递归互斥信号量二 释放递归互斥信号量三 获取递归互斥信号量四 官方例程总结 前言 递归互斥信号量可以看成是一个特殊的互斥信号量 对于互斥信号量 xff0c 获取了互斥信号量的任务就不能再次获取这个互斥信号量 xff0c
  • toString用法

    toString是定义在java lang Object的方法 xff0c 因此所有类都可以使用toString方法 xff0c 但是 toString方法本身返回的是地址信息而对于String Date File 包装类 等都重写了toS
  • 商医通项目总结

    一 项目概述 简介 尚医通即为网上预约挂号系统 xff0c 网上预约挂号是近年开展的一项便民就医服务 xff0c 旨在缓解看病难 挂号难的就医难题 网上预约挂号全面提供的预约挂号业务从根本上解决了这一就医难题 随时随地轻松挂号 xff0c
  • docker安装以及遇到的问题

    目录 一 docker安装 二 安装中可能碰到的问题 1 WSL 2 installation is incomplete 一 docker安装 docker官网下载 xff1a Docker Desktop Docker xff0c 下载
  • STM32MP157实验(三)——按键扫描和中断

    文章目录 按键扫描设计需求基础知识硬件设计STM32CubeIDE设计MX设置代码设计 实验结果 按键中断设计需求基础知识硬件设计STM32CubeIDE设计MX设置代码设计 总结 按键扫描 设计需求 通过按键扫描的方式实现 xff0c 按
  • 一篇博客实现嵌入式入门

    文章目录 前言最小系统和C语言最小系统原理图电源电路时钟电路复位电路调试 下载电路 嵌入式C语言基础知识数据类型const用法修饰变量修饰数组修饰指针修饰函数参数 作用域与static用法extern的用法volatile的用法struct
  • 驱动开发(一)——(单片机程序、Linux应用程序与驱动程序分析)

    文章目录 前言157准备工作配置交叉编译链编译内核编译解压glibc 单片机程序应用程序驱动程序三者的关系 前言 学习资料 xff0c 跟的韦东山老师的视频 xff0c 大家可以上百问网下载资料 百问网 我使用的开发板是STM32MP157
  • 驱动开发(五)——驱动设计思想(面向对象/分层/分离)

    文章目录 设计思想面向对象分层分离 实验手册资源驱动程序 led drv cled operations h芯片相关chip gpio cled resource h单板相关 board MP157 led c应用测试程序Makefile
  • 【shell】遇到错误退出set -e|set -u|set -x|shell 退出时执行|捕捉信号trap

    目录 遇到错误退出 简介和使用 set e 的陷阱 1 xff0c 管道命令 2 xff0c grep匹配不到会导致退出 shell退出时执行 接收信号 trap 用途 trap介绍 列出所有信号的数值和名字 trap的注意事项 遇到错误退
  • 我的世界java版官方网站,讲的太透彻了

    简介 基于SpringCloud Hoxton SR1 43 SpringBoot 2 2 4 RELEASE 的 SaaS型微服务脚手架 xff0c 具备用户管理 资源权限管理 网关统一鉴权 Xss防跨站攻击 自动代码生成 多存储系统 分
  • 深入理解java虚拟机pdf,GitHub已标星16k

    专题5 xff1a Java序列化 1 什么是java序列化 xff0c 如何实现java序列化 xff1f 2 保存 持久化 对象及其状态到内存或者磁盘 3 序列化对象以字节数组保持 静态成员不保存 4 序列化用户远程对象传输 5 Ser
  • 成功入职阿里月薪45K,附赠课程+题库

    网站基础知识 xff08 网站架构及其演变过程 43 常见协议和标准 43 DNS的设置 43 Java中Socket的用法 43 HTTP协议 43 详解Servlet 43 Tomcat分析 xff09 俯视 Spring MVC xf
  • 快醒醒吧!springcloud分布式事务面试题

    一 什么是架构和架构本质 在软件行业 xff0c 对于什么是架构 xff0c 都有很多的争论 xff0c 每个人都有自己的理解 此君说的架构和彼君理解的架构未必是一回事 因此我们在讨论架构之前 xff0c 我们先讨论架构的概念定义 xff0
  • 基于java实现直播,太牛了!

    美团技术一面20分钟 晚7点 xff0c 因为想到下周一才面试 xff0c 我刚准备出去打个羽毛球 xff0c 北京的电话就来了 面试官各种抱歉 xff0c 说开会拖延了 1 自我介绍 说了很多遍了 xff0c 很流畅捡重点介绍完 2 问我
  • java银行面试题目及答案,顺利拿到offer

    二 常见的并发问题 1 脏读 一个事务读取了另一个事务未提交的数据 2 不可重复读 一个事务对同一数据的读取结果前后不一致 两次读取中间被其他事务修改了 3 幻读 幻读是指事务读取某个范围的数据时 xff0c 因为其他事务的操作导致前后两次
  • 白嫖党最爱!javasocket服务端向客户端发消息

    一 公务员都不要35岁以上的 xff0c 何况大公司 这让很多人感到惶恐 xff0c 现在职场上有一种现象 xff1a 很多用人单位会在招聘信息上明确标注 xff0c 年龄需在35岁以下 为什么有经验 有人脉的职场中年人会如此遭 嫌弃 呢
  • Mybatis源码解析:21道Java基础面试题及答案

    10 HashMap和HashTable的区别 答案 xff1a Hashtable和HashMap类有三个重要的不同之处 1 第一个不同主要是历史原因 Hashtable是基于陈旧的Dictionary类的 xff0c HashMap是J
  • Mybatis源码解析:Java泛型详解

    注意 xff1a 泛型的类型参数只能是类类型 xff0c 不能是基本属性类型 xff1b 不能对确切的泛型类型使用instanceof操作 如下面的操作是非法的 xff0c 编译时会出错 if ex num instanceof Gener