Java泛型4——泛型方法

注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过

目录:

  • Java泛型1——概述
  • Java泛型2——泛型类
  • Java泛型3——泛型接口
  • Java泛型4——泛型方法
  • Java泛型5——泛型擦除
  • Java泛型6——通配符

定义泛型方法

泛型方法的定义格式如下:

<泛型标记符1, 泛型标记符2……> 返回类型 方法名(泛型标记符1 变量名1, 泛型标记符2 变量名2……) {}

泛型标记符出现了两次

一次在<>中,一次在()中,其中:

  • <>中指明在接下来的函数参数列表中可以使用的泛型标记符
  • ()中是函数参数,可以出现的类型有:
    • 8种基本数据类型
    • <>中的泛型标记符
    • 定义泛型类(如果这个方法在一个泛型类中)时的泛型标记符

比如下面代码:

class TestClass<T> {public <U, V> void f(int a, T b, U c) {}
}

泛型方法 f() 共有3个参数,包括:

  • 1个基本数据类型a,在定义函数的时候就指明是int类型的了

  • 1个泛型参数类型b,在实例化对象的时候才能确定T代表的数据类型(T是定义泛型类时使用的泛型参数)

  • 1个泛型参数类型c,在调用函数的时候才能确定U代表的数据类型(U是定义泛型方法时使用的泛型参数)

上面泛型方法在定义的时候提供了两个泛型参数即U和V,但实际在参数列表中只使用了一个U,虽然这种写法很神经,但这种写法在语法上没问题。

注意泛型方法和使用泛型类中的类型参数的方法

class TestClass<T> {void f_1(T t) {//这只是使用了定义泛型类时的类型参数,不是泛型方法System.out.println("这不是泛型方法");}public <U> void f_2(U u) {//这才是泛型方法System.out.println("这才是泛型方法");}
}
  • 定义泛型方法:函数签名的返回值前面加了<>
  • 使用泛型类中的类型参数:函数签名中仅有参数中使用了定义类时的类型参数

泛型方法的几种定义方式

class TestClass<T> {public void f_1(T t) {//这只是使用了定义泛型类时的类型参数,不是泛型方法System.out.println("这不是泛型方法");}public <U> void f_2(U u) {//这才是泛型方法System.out.println("这才是泛型方法");}public static <U> void f_3(U u) {//静态泛型方法System.out.println("静态泛型方法");}public <U, V> void f_4(U u, V v) {//同时使用多个类型参数System.out.println("使用多个类型参数");}public <U> void f_5(U u, T t) {//使用了定义泛型类时的类型参数System.out.println("使用了定义泛型类时的类型参数");}
}

泛型方法重载

对泛型方法重载时,只可以通过参数数目进行重载,如:

class TestClass {public <T> void f_1(T t) {}public <U> void f_1(U u) {//类型参数数目相同,编译报错}public <T> void f_1(T t1, T t2) {//类型参数数目不同,方法重载}
}

public <T> void f_1(T t)public <U> void f_1(U u) 仅仅是使用的类型参数名字不同(一个是T一个是U),无法区分两个方法。

泛型方法和可变长参数

class TestClass {public <T> void f_1(T... args) {for (T t : args) {System.out.println(t);}}
}

调用泛型方法

显式调用泛型方法的格式如下:

对象名(或类名,如果是静态方法).<数据类型1, 数据类型2……>方法名(参数1, 参数2……)

同时,泛型方法也支持非显式调用。实例化泛型类或者实现泛型接口时需要指定类型参数(否则自动设置为Object),但在调用泛型方法时,通常不需要指定参数类型,编译器会根据传入参数的数据类型自动判断出类型参数所代表的具体数据类型,这被称为类型参数推断。对于基本类型,编译器还可以根据变量类型进行自动装箱(将基本类型自动转换成它们对应的包装类,将包装类自动转换成它们对应的基本类型称为自动拆箱)。

一个类型参数

public class Main {private static <T> void f(T t) {System.out.println(t);}public static void main(String[] args) {Main.f(1);//自动装箱成 IntegerMain.<Integer>f(1);//与上面等价Main.f('a');//自动装箱成 CharacterMain.<Character>f('a');Main.f("abc");//字符串是一个String类型的对象,不是基本类型,不进行自动装箱Main.<String>f("abc");}
}

多个类型参数

  • 显式调用的时候根据指定的参数类型设置

  • 非显式调用的时候会进行类型推断,若参数的类型相同则设置为相同的类型,否则将类型参数设置为所有传入参数最小的共同父类,比如:

    • 1 和 2 取 Integer
    • 1.2 和 3 取 Number
    • 1 和 “abc” 取 Object
    public class Main {private static <T, U> void f(T t, U u) {System.out.println(t);}public static void main(String[] args) {Main.f(1, 2);//自动装箱为 Integer 和 IntegerMain.<Integer, Integer>f(1, 2);//与上面等价,参数类型相同取相同的Main.f(1.2, 3);//自动装箱为 Double 和 IntegerMain.<Number, Number>f(1.2, 3);//与上面等价,设置为 Double 和 Integer 的最小共同父类 NumberMain.f(1, "abc");//1自动装箱为 IntegerMain.<Object, Object>f(1, "abc");//与上面等价,设置为 Integer 和 String 的最小共同父类 Object}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python调用各大机器翻译API大全

过去的二三年中&#xff0c;我一直关注的是机器翻译API在自动化翻译过程中的应用&#xff0c;包括采用CAT工具和Python编程语言来调用机器翻译API&#xff0c;然后再进行译后编辑&#xff0c;从而达到快速翻译的目的。 然而&#xff0c;我发现随着人工智能的发展&#xff0c;很…

STM32 LWIP UDP 一对一 一对多发送

STM32 LWIP UDP通信 前言设置 IP 地址UDP函数配置实验结果单播发送&#xff0c;一对一发送广播发送&#xff0c;一对多发送 可能遇到的问题总结 前言 之前没有接触过网络的通信&#xff0c;工作需要 UDP 接收和发送通信&#xff0c;在网上没有找到一对一、一对多的相关例程&am…

什么是SVM算法?硬间隔和软间隔的分类问题

SVM全称是supported vector machine(支持向量机)&#xff0c;即寻找到一个超平面使样本分成两类&#xff0c;并且间隔最大。 SVM能够执行线性或⾮线性分类、回归&#xff0c;甚至是异常值检测任务。它是机器学习领域最受欢迎的模型之一。SVM特别适用于中小型复杂数据集的分类。…

使用Python生成文件的MD5和sha1

使用Python生成文件的MD5和sha1 1. [代码]生成文件的MD5和sha1 #codingUTF-8 # www.iplaypy.com python # XingHe Studio File to MD5 and SHA1def fil_changefileext(filename,extname):# FIL ChangeFileExt 改变文件扩展名# filename 输入的文件路径名# extname 要更改…

CentOS 8 错误: Error setting up base repository

配置ip、掩码、网关、DNS VMware网关可通过如下查看 打开网络连接 配置镜像的地址 vault.centos.org/8.5.2111/BaseOS/x86_64/os/

Spring Data Redis

启动指令 redis-server.exe redis.windows.conf 1.导入Spring Data Redis的maven坐标 在pom.xml中添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependen…

通过String字符生成base64编码在生成图片

* base64转图片 //对字节数组字符串进行Base64解码并生成图片 * param base64str base64码 * return // param savePath 图片路径private static final String savePath"image_ver\\verifyCode"; 判断是否为base64编码 public static void mainDD…

【JavaEE初阶】Servlet (三)MessageWall

在我们之前博客中写到的留言墙页面,有很严重的问题:(留言墙博客) 如果刷新页面/关闭页面重开,之前输入的消息就不见了.如果一个机器上输入了数据,第二个机器上是看不到的. 针对以上问题,我们的解决思如如下: 让服务器来存储用户提交的数据,由服务器保存. 当有新的浏览器打开页…

基于java的坦克大战游戏的设计与实现--答辨PPT--【毕业论文】

文章目录 本系列校训毕设的技术铺垫PPT主体层次封面页目录页&#xff1a;设计工具与相关技术&#xff1a;系统分析总体设计&#xff1a;详细设计测试结论&#xff1a; 小技巧 本系列校训 互相伤害互相卷&#xff0c;玩命学习要你管&#xff0c;天生我才必有用&#xff0c;我命…

React(1)——快速入门

一、React背景简介 官网和资料 英文官网: https://reactjs.org/中文官网: 快速入门 – React (docschina.org) 3、如果JS基础忘了及时查看文档&#xff1a;JavaScript - 学习 Web 开发 |多核 (mozilla.org) JavaScript - 标签 - 汤姆大叔 - 博客园 (cnblogs.com) 4、React…

Neo4j图数据基本操作

Neo4j 文章目录 Neo4jCQL结点和关系增删改查匹配语句 根据标签匹配节点根据标签和属性匹配节点删除导入数据目前的问题菜谱解决的问题 命令行窗口 neo4j.bat console 导入rdf格式的文件 :GET /rdf/ping CALL n10s.graphconfig.init(); //初始化 call n10s.rdf.import.fetch(&q…

【软件测试】webdriver常用API演示(Java+IDEA+chrome浏览器)

1.元素定位方法 对象的定位应该是自动化测试的核心&#xff0c;要想操作一个对象&#xff0c;首先应该识别这个对象。一个对象就是一个人一样&#xff0c;他会有各种的特征&#xff08;属性&#xff09;&#xff0c;如比我们可以通过一个人的身份证号&#xff0c;姓名&#xf…

在CSDN学Golang云原生(监控解决方案Prometheus)

一&#xff0c;记录规则配置 在golang云原生中&#xff0c;通常使用日志库记录应用程序的日志。其中比较常见的有logrus、zap等日志库。这些库一般支持自定义的输出格式和级别&#xff0c;可以根据需要进行配置。 对于云原生应用程序&#xff0c;我们通常会采用容器化技术将其…

cmake stm32 模板

文件结构 ├─.vscode ├─build ├─cmake ├─Drivers │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F1xx │ │ │ ├─Include │ │ │ └─Source │ │ │ └─Templates │ │ └─Include │ └─STM32F1xx_HAL_Driver │ ├─Inc │ │ └─Leg…

Redis 笔记,基本数据类型、持久化、主从、集群等等问题

标题 &#x1f600;&#x1f600;&#x1f600;创作不易&#xff0c;各位看官点赞收藏. 文章目录 标题Redis 基础笔记1、安装及环境搭建2、Redis 数据类型2.1、String2.2、List2.3、Hash2.4、Set2.5、Zset2.6、BitMap2.7、HyperLogLog2.8、Geospatial2.9、Stream 3、Redis 持久…

「BLIP 微调指南」以 Image-Text Captioning 任务为例

前言&#xff1a;近日需要用到 BLIP 微调下游任务&#xff0c;搜索发觉如今并无 BLIP 微调教程&#xff0c;下面就以 Image-Text Captioning 任务为例&#xff0c;演示如何完成 BLIP 模型在自己数据集上的微调。 目录 1. BLIP 介绍2. 关键代码定位3. 关键参数赋值4. 模型定义&a…

HTML一些基础知识

1、Web标准&#xff1a;主要包含结构、表现、行为。结构用于对网页元素进行整理和分类&#xff0c;主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式&#xff0c;主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写&#xff0c;主要是js文件。 Html相当…

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…

尚硅谷大数据项目《在线教育之采集系统》笔记002

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 # 1、定义组件&#xff0c;为各组件命名 a1.sources r1 a1.channels c1 a1.sinks - k1# 2、配置sources&#xff0c;描述source a1.sour…

微服务划分的原则

微服务的划分 微服务的划分要保证的原则 单一职责原则 1、耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密&#xff0c;其耦合性就越强&#xff0c;模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及…