泛型如何定义和使用?

根据使用的地方分为3种,分别是泛型类,泛型方法和泛型接口。

(1)泛型类

泛型类的定义

在类名的后面加一对尖括号,括号中填写类型参数,参数可以有多个,多个参数之间使用逗号分隔。

下面是一个例子:

public class GenericTest <E>{private E value;public E getValue(){return value;}public void setValue(E e){this.value = e;}
}

Java 还是建议使用单个大写字母来代表类型参数。常见的如:

  1. T 代表Type的意思,表示任意的类。
  2. E 代表 Element 的意思,或者 Exception 异常的意思。
  3. K 代表 Key 的意思。
  4. V 代表 Value 的意思,通常与 K 一起配合使用。
  5. S 代表 Subtype 的意思,文章后面部分会讲解示意。
泛型类的使用

在创建泛型类对象的时候指定相应的类型,如ArrayList<String>。

(2)泛型方法

泛型方法的定义

尖括号那一部分写在返回值之前

有一点需要注意:不能使用别的方法中使用本方法中定义的泛型,会报错。可以理解为方法中定义的泛型,作用范围只有本方法。

下面是一个例子:

public class GenericTest2 {public <E> void set(E e){}
}
泛型方法的使用

类型推断:编译器会根据调用方法时实参的类型进行推断,所以不用在尖括号中间指定类型。例如,在上述代码中,编译器根据传递的参数"123" 将E指定为String 类型,它发生在编译时。 

public class GenericDemo2 {public static void main(String[] args) {GenericTest2 g2 = new GenericTest2();g2.set("123");}
}

练习1:定义一个工具类ListUtil,其中有一个静态方法,可以向不同的集合中添加多个元素。

public class ListUtil {private ListUtil(){}public static <E> void addAll (ArrayList<E> list, E e1, E e2){list.add(e1);list.add(e2);}
}

在调用此方法将list传递过去的时候,会将E指定为String类型。 

细节:而且这个方法可以传递集合中的元素是任意类型的ArrayList集合过去。 

public class GenericDemo3 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");ListUtil.addAll(list, "3", "4");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String s = iterator.next();System.out.println(s);}}
}

(3)泛型接口

泛型接口的定义

也是在接口的后面加上一对尖括号。

public interface Iterable<T> {
}
泛型接口的使用

根据实现的时候是否确定类型有两种方式去实现接口。

方式1:在接口后面的尖括号中给出具体类型。

这里的类GenericDemo6在实现时给出具体的String类型,那么在创建实现类的对象时就不用再给出类型了,并且操作的只能是String类型的数据。

public class GenericDemo6 implements List<String> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}...}

 方式2:实现类依然延续泛型,在类名和接口后面都加上一对尖括号,创建对象时再指定类型。

public class GenericDemo7<E> implements List<E> {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}...}

细节:

一个.java文件里可以有多个类。

多个类中只能有一个public类,而且文件名只能是public类的名字;

如果多个类中没有public类,则文件名可以是任意一个类的名字。

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

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

相关文章

从与原始的Transformer architecture比较来理解GPT

从与原始的Transformer architecture比较来理解GPT flyfish 一、Transformer architecture 先说名词 不同的文献和资料中有不同的名字&#xff0c;其实是一样的意思 1 编码器-解码器多头注意力机制&#xff08;Encoder-Decoder Multi-Head Attention Mechanism&#xff09; …

ASP.NET Core中上传文件

1.创建一个文件上传的表单 在一个视图中&#xff08;比如Index.cshtml&#xff09;&#xff0c;添加一个表单来让用户选择文件并上传。 model IFormFile <form method"post" enctype"multipart/form-data"> <div class"form-group"…

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…

韩顺平0基础学java——第39天

p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2.Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…

flink 实现大数据实时数据采集

Apache Flink 是一个流处理框架&#xff0c;用于处理无界和有界数据流。在大数据实时数据采集领域&#xff0c;Flink 凭借其高吞吐量、低延迟和精确的状态管理特性&#xff0c;成为了实现实时数据处理的理想选择。下面将介绍如何使用 Flink 来实现大数据的实时数据采集和处理。…

《Milvus Cloud向量数据库指南》——ChatGLM:从GLM-130B到GLM-4

ChatGLM:从GLM-130B到GLM-4的跨越:智谱AI在通用人工智能领域的深度探索与实践 在人工智能的浩瀚星空中,智谱AI如同一颗璀璨的新星,以其独特的技术视角和坚定的创新步伐,在通用人工智能(AGI)的征途上留下了深刻的足迹。技术生态总监贾伟在近期的一次分享中,不仅为我们描…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…

49.TFT_LCD液晶屏驱动设计与验证(2)

&#xff08;1&#xff09;Visio视图&#xff1a; &#xff08;2&#xff09;控制模块Verilog代码&#xff1a; module tft_ctrl(input clk_33M ,input reset_n ,input [23:0] data_in ,output [9:0] hang…

Cortex-M内核M0,M0+,M3,M4,M7之间的区别

之所以ARM公司会把Cortex-M分为这么多系列&#xff0c;主要是针对不同的应用领域&#xff1b;下面详细介绍&#xff1a; Cortex-M分为&#xff1a;M0&#xff0c;M0&#xff0c;M3&#xff0c;M4&#xff0c;M7 M0&#xff0c;M0&#xff1a;基础版本&#xff0c;从图中可以看…

Centos部署PHP

环境&#xff1a;Centos7 安装PHP步骤&#xff1a; 一&#xff1a;安装依赖 yum install epel-release -yyum install gcc openssl-devel libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel -y 二&#xff1a;下载php源码⽂件 cd /usr/local/srcwge…

PLSQL Developer工具查询数据,报错(动态性能表不可访问)

解决的问题&#xff1a; 解决方案&#xff1a; 在配置-首选项-选项&#xff0c;取消勾选“自动统计”&#xff0c;保存之后即可查询数据

WSL快速入门

1. WSL介绍 WSL文档地址&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl WSL&#xff1a;全称 Windows Subsystem for Linux&#xff0c;即windows上的Linux子系统&#xff08;虚拟机工具&#xff09;。是Win10推出的全新特性&#xff0c;可以更轻量地在Windows系统…

【网络安全】子域名模糊测试实现RCE

未经许可&#xff0c;不得转载。 文章目录 正文总结 正文 在之前测试一个私人项目时&#xff0c;我报告了admin.Target.com上的Auth Bypass漏洞&#xff0c;这将导致SQLI&RCE &#xff0c;该漏洞在报告后仅一天就被修复。 现在重拾该应用程序&#xff0c;对子域进行模糊测…

Java整理18

1、AOP AOP概念&#xff1a;通过预编译方式和运行期动态代理方式实现&#xff0c;在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。 动态代理分类:JDK动态代理&#xff1a;有接口代理对象和目标对象实现同样的接口cglib动态代理&#xff1a;无接口继承被代理的目…

Symfony 表单构建器:创建和管理表单的最佳实践

Symfony 表单构建器&#xff1a;创建和管理表单的最佳实践 Symfony 是一个流行的 PHP 框架&#xff0c;以其强大的功能和灵活性闻名。表单构建器是 Symfony 中一个非常重要的组件&#xff0c;它提供了简单且高效的方式来创建和管理表单。本文将详细介绍 Symfony 表单构建器的最…

利用jdk自带keytool工具生成jks签名文件注意事项

如题&#xff0c;用三个不同版本jdk生成jks文件&#xff0c;并配置到Android Studio里面验证&#xff0c;结果如下&#xff1a; jdk1.8&#xff1a;正常 jdk11、jdk17&#xff1a;出错&#xff0c;错误日志如下 FAILURE: Build completed with 2 failures.1: Task failed with…

RAG技术之Router

Router有什么用&#xff1f; 在RAG应用中&#xff0c;Router可以帮助我们基于用户的查询意图来决定使用何种数据类型或数据源&#xff0c;比如是否需要进行语义检索、是否需要进行text2sql查询&#xff0c;是否需要用function call来进行API调用。 Router也可以根据用户的查询…

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…