Java中的泛型类型参数详解

Java中的泛型机制为开发者提供了一种编写通用代码的强大工具,使得代码在编译时可以进行类型检查,从而减少运行时的错误。泛型类型参数可以帮助我们编写更加灵活和类型安全的代码。在Java的泛型类型参数中,我们经常会看到一些常见的符号,如?TKVE等。本文将详细解释这些符号的含义及其使用场景,并结合示例代码进行说明。

1. ?(通配符)

1.1 定义位置

?是一种通配符类型参数,通常用于方法签名中作为类型参数的占位符。

1.2 使用场景

?主要用于限定集合的读取操作,例如读取列表元素,但是不能写入。它可以出现在方法参数或局部变量的声明中。

1.3 具体性

?是一个不确定的类型,表示“任意类型”。这意味着你可以将任何类型的对象放入这个引用中,但只能进行受限的操作,因为编译器无法知道确切的类型。

示例:

import java.util.ArrayList;
import java.util.List;public class WildcardExample {public static void printList(List<?> list) {for (Object obj : list) {System.out.println(obj);}}public static void main(String[] args) {List<String> stringList = new ArrayList<>();stringList.add("Apple");stringList.add("Banana");printList(stringList);}
}

在上面的示例中,printList方法接受一个通配符类型的列表,并可以打印列表中的元素。

2. T(类型)

2.1 定义位置

T(或其他字符)是在类或方法上声明的类型参数,它代表一个未知的具体类型。

2.2 使用场景

T通常用作类或接口中的类型参数,在整个类或接口的上下文中可以多次使用。例如,你可能有一个List类型的成员变量,并且有多个返回值为T的方法。

2.3 具体性

T可以指定为任何非基本类型,包括具体的类、接口或者其他的类型参数。当你需要在一个范围内操作同一种未知类型时,会使用到T

示例:

public class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}public static void main(String[] args) {Box<Integer> integerBox = new Box<>();integerBox.set(10);System.out.println("Box contains: " + integerBox.get());}
}

在上面的示例中,Box类使用了类型参数T来定义一个泛型类,可以存储任意类型的数据,并且在main方法中实例化了一个Box<Integer>对象来存储整数。

3. KV(键和值)

3.1 定义位置

KV通常用在表示键值对的泛型类或接口中。

3.2 使用场景

KV通常用于表示键值对中的键和值的类型。在Map接口中,K表示键的类型,V表示值的类型。

示例:

import java.util.HashMap;
import java.util.Map;public class KeyValueExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("One", 1);map.put("Two", 2);System.out.println("Value for key 'One': " + map.get("One"));}
}

在上面的示例中,使用了Map接口来存储键值对,其中K表示键的类型为StringV表示值的类型为Integer

4. E(元素)

4.1 定义位置

E通常用来表示集合中的元素类型。

4.2 使用场景

E通常用于表示集合中的元素类型。在List接口中,E表示列表中元素的类型。

示例:

import java.util.ArrayList;
import java.util.List;public class ElementExample {public static void main(String[] args) {List<String> stringList = new ArrayList<>();stringList.add("Hello");stringList.add("World");System.out.println("Element at index 0: " + stringList.get(0));}
}

在上面的示例中,创建了一个List<String>类型的列表,并向其中添加了两个字符串元素。然后通过get方法获取索引为0的元素。

5. 示例总结

为了更好地理解这些类型参数的用法,下面是一个综合示例:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;public class GenericExample {// 使用Tpublic static class Box<T> {private T t;public void set(T t) {this.t = t;}public T get() {return t;}}// 使用K和Vpublic static class Dictionary<K, V> {private Map<K, V> map = new HashMap<>();public void add(K key, V value) {map.put(key, value);}public V get(K key) {return map.get(key);}}// 使用Epublic static class CustomList<E> {private List<E> list = new ArrayList<>();public void add(E element) {list.add(element);}public E get(int index) {return list.get(index);}}// 使用通配符public static void printList(List<?> list) {for (Object obj : list) {System.out.println(obj);}}public static void main(String[] args) {// 使用BoxBox<Integer> integerBox = new Box<>();integerBox.set(10);System.out.println("Box contains: " + integerBox.get());// 使用DictionaryDictionary<String, Integer> dictionary = new Dictionary<>();dictionary.add("One", 1);dictionary.add("Two", 2);System.out.println("Dictionary key 'One': " + dictionary.get("One"));// 使用CustomListCustomList<String> customList = new CustomList<>();customList.add("Hello");customList.add("World");System.out.println("CustomList element at index 0: " + customList.get(0));// 使用通配符List<String> stringList = new ArrayList<>();stringList.add("Apple");stringList.add("Banana");printList(stringList);}
}

6. 结论

理解Java中的泛型类型参数对于编写类型安全、灵活的代码至关重要。通过熟悉?TKVE的含义及其使用场景,开发者可以更好地利用Java泛型机制,编写出更为通用和高效的代码。希望本文对你理解和使用Java泛型有所帮助。

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

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

相关文章

代碼隨想录 day22|day23

二叉树(完) 二叉搜索树的最近公共祖先 题意&#xff1a;找到二叉树的两个节点的祖先节点 。 思路&#xff1a; 二叉树的中序遍历特性&#xff1a; 如果当前遍历的节点的值> 两个指定的节点的值。 那么祖先节点就在当前节点左子树 。 如果当前遍历节点的值< 两个节点的值…

赶紧收藏!2024 年最常见 20道 Kafka面试题(四)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Kafka面试题&#xff08;三&#xff09;-CSDN博客 七、Kafka数据一致性原理是什么&#xff1f; Kafka的数据一致性原理主要依赖于其内部的复制机制、分区策略、领导者与追随者&#xff08;Leader and Follower…

java-成员变量和局部变量

Java中的变量根据其作用域和生命周期可以分为两大类&#xff1a;成员变量&#xff08;Instance Variables&#xff09;和局部变量&#xff08;Local Variables&#xff09;。这两类变量在Java程序中扮演着重要的角色&#xff0c;它们用于存储程序运行时所需的数据。 一、成员变…

贝锐向日葵分组策略:减少重复操作,提升管理效率

面对大数量级的IT设备&#xff0c;如何高效实施管理是运维的关键所在&#xff0c;如何快速准确的对大量的设备按需分组&#xff0c;则是管理精准触达的第一步。 但是&#xff0c;传统的分组方式应付少量设备还可行&#xff0c;设备数量级一旦来到上千台甚至更多时&#xff0c;…

【分红+估值修复】人工智能选股策略》?

今天公告中的部分内容上次去兴业交流的时候跟管理层也聊到了&#xff0c;比如分红、大股东增持、六大新赛道等。 我一直呼吁的管理层增持这次也体现在公告中。 这都体现了上市公司对于维护公司股价和合理估值的重视&#xff0c;对于股东合理投资回报的重视。 对于上市公司而言&…

linux安装docker步骤

步骤1 脚本自动安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh 步骤2 启动Docker服务: sudo systemctl start docker 步骤3 验证Docker是否正确安装并运行一个容器: sudo docker run hello-world 安装正确&#xff0c;则可拉取镜像&am…

C++的std::optional的用法

C++的std::optional的用法 在编程中,处理可能为空的变量或结果是一个常见的挑战。确实,传统的几种方法都有其局限性,可能导致代码的可读性和可维护性降低。如下的方式: 使用特殊值标记: 虽然使用特殊值(如-1、INFINITY、nullptr等)来标记无效或缺失的值很常见,但这种…

在vue3和ant-design-vue的项目中,下拉绑定,显示文字,取值数字

要是以前&#xff0c;用js,jq就很容易实现&#xff0c; 新框架旧写法 <template><a-form><!-- 其他表单项 --><a-form-item label"银行名称"><a-selectv-model:value"state.selectedBankId"placeholder"请选择银行"…

Mongo常用语法(java代码)

1、根据agentId字段分组&#xff0c;并对totalCustomerNum、refundCustomerNum字段 sum求和&#xff0c;同时取别名 Overridepublic List<AgentCountInfoBean> selectCurrentMonthNewResource(Set<String> orderTypeSet, List<String> agentIds,LocalDateTim…

6.4 Go 映射(Map)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【vuejs】组件中 data 函数的作用和分析

1. 组件复用性与数据隔离 组件在Vue中是用于复用的&#xff0c;每个组件实例应该拥有自己的独立状态&#xff0c;以避免不同组件实例之间的数据冲突和相互影响。Vue通过将组件的data定义为一个函数来实现这一点。 1.1 组件复用性 组件复用性是指组件可以在多个地方被重复使用…

Java 异常处理详解(如果想知道Java中有关异常处理的知识点,那么只看这一篇就足够了!)

前言&#xff1a;异常处理是 Java 编程中非常重要的一部分&#xff0c;它能够有效地捕获和处理程序运行中的错误&#xff0c;提高代码的健壮性和可靠性。本文将深入探讨 Java 中异常的概念、体系结构、抛出、解决方式以及如何自定义异常&#xff0c;并结合代码案例进行详细解释…

mysql 如果有按照时间范围查询结果

1.前端传2024-06-21 到我们xml sql 文件中默认实际是 2024-06-21 00:00:00 <if test"dto.startTime ! null">and ps.created_at > #{dto.startTime}</if><if test"dto.endTime ! null">and ps.created_at < #{dto.endTime}</if…

Java 面试题:Java 的动态代理是基于什么原理?

编程语言通常有各种不同的分类角度&#xff0c;动态类型和静态类型就是其中一种分类角度&#xff0c;简单区分就是语言类型信息是在运行时检查&#xff0c;还是编译期检查。 与其近似的还有一个对比&#xff0c;就是所谓强类型和弱类型&#xff0c;就是不同类型变量赋值时&…

Stage #1 无过滤的XSS注入:基础与实操

Stage #1 无过滤的XSS注入&#xff1a;基础与实操 跨站脚本攻击&#xff08;XSS&#xff09;是Web安全领域中一种常见的攻击手段。在"XSS Challenges"闯关游戏中&#xff0c;Stage #1专为初学者设计&#xff0c;用于练习无过滤的XSS注入技术。本文将详细介绍这一阶段…

Linux命令篇(六):vi/vim专项

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝您生活愉快&#xff01; 文章目录 一、什么是vim二…

Microsoft Outlook Lite 引入短信功能

随着科技的不断进步&#xff0c;我们的沟通方式也在不断演变。微软最新推出的 Outlook Lite 应用&#xff0c;不仅为我们提供了一个轻量级的电子邮件管理工具&#xff0c;现在更是带来了一项令人兴奋的新功能——短信服务。 Outlook Lite&#xff1a;轻量级&#xff0c;功能全…

【.Net】Linq的使用

文章目录 一、Linq介绍二、在两个数据源联合查询中的使用三、Linq的其他用法 一、Linq介绍 LINQ&#xff08;Language Integrated Query&#xff09;是C#中的一个强大功能&#xff0c;允许您使用统一的语法查询和操作来自不同数据源的数据。 二、在两个数据源联合查询中的使用…

今日好料推荐(ARM嵌入式)

今日好料推荐&#xff08;ARM嵌入式&#xff09; 参考资料在文末获取&#xff0c;关注我&#xff0c;获取优质资源。 给我留言&#xff0c;会帮大家寻找需要的资料。 ARM 嵌入式系统 嵌入式系统在现代电子设备中扮演着至关重要的角色&#xff0c;从智能手机到工业自动化&am…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…