Java泛型简介

Java泛型简介

        Java泛型是在Java 5中引入的一个特性,它允许程序员在编译时指定类、接口或方法能够接受的类型。泛型的主要目的是提供编译时类型安全检查,避免在运行时因为类型转换错误而导致的ClassCastException

        在没有泛型之前,Java中的集合类(如ListSet等)都是类型不安全的。这意味着你可以将任何类型的对象放入集合中,这在运行时可能会导致类型转换错误。泛型的引入使得我们可以创建类型安全的集合。

泛型的好处

  1. 类型安全:泛型提供了编译时类型检查,减少了运行时类型转换错误。
  2. 代码重用:泛型使得我们可以编写更通用的代码,适用于不同的数据类型。
  3. 性能提升:泛型避免了类型转换,减少了运行时的开销。

泛型的基本语法

        泛型的基本语法如下:

public class ClassName<T> { 

    // T 是一个类型参数,可以是任何类型 
    T data; 

    public ClassName(T data) { this.data = data; } 

    public T getData() { return data; } 

    public void setData(T data) { this.data = data; } 

}

在这个例子中,T是一个类型参数,它可以在创建ClassName对象时被任何类型所替代。

使用泛型

        使用泛型非常简单,只需要在声明变量或创建对象时指定具体的类型即可:

ClassName<String> stringHolder = new ClassName<>("Hello World"); 

ClassName<Integer> intHolder = new ClassName<>(42);

泛型方法

        泛型也可以用于方法。在方法声明中,你可以指定类型参数:

public class Util { 

    public static <T> void printArray(T[] array) { 
        for (T element : array) { 
            System.out.print(element + " "); 
        } 
        System.out.println(); 
    } 
}

这个printArray方法可以接受任何类型的数组,并打印出数组中的所有元素。

泛型的类型推断

        Java编译器可以根据上下文推断出泛型的具体类型,这称为类型推断。例如:

List<String> list = new ArrayList<>(); 
list.add("Hello"); 
list.add("World");

在这个例子中,即使我们没有显式指定泛型类型,编译器也能推断出list是一个List<String>类型。

泛型的边界

        泛型类型参数可以有边界,这限制了可以作为类型参数的类型。边界通常使用extends关键字指定:


public class Animal { // ... } 
public class Dog extends Animal { // ... } 

public class ClassName<T extends Animal> { 
    T data; 
    public ClassName(T data) { this.data = data; } 
    public T getData() { return data; } 
    public void setData(T data) { this.data = data; } 
}

在这个例子中,T必须是一个Animal的子类。这意味着你可以创建ClassName<Dog>ClassName<Animal>,但不能创建ClassName<String>

泛型的通配符

泛型还可以使用通配符来表示未知的类型。通配符有两种:无界通配符(?)和有界通配符(? extends T? super T)。

无界通配符用于不需要知道具体类型的场合:

public static void printList(List<?> list) {
     for (Object element : list) { 
        System.out.print(element + " "); 
    } 
    System.out.println(); 
}

有界通配符用于需要知道类型的上下界的场合:

public static <T> void printListUpper(List<? extends T> list) { // 只能使用T或T的子类 } public static <T> void printListLower(List<? super T> list) { // 只能使用T或T的父类 }

泛型的类型擦除

        Java泛型在编译时是存在的,但在运行时会被擦除。这意味着泛型类型信息在运行时是不可见的。为了解决这个问题,Java提供了一些机制,如泛型签名的保留。

结论

        Java泛型是一个强大的特性,它提高了代码的类型安全性和重用性。通过泛型,我们可以编写更通用、更灵活的代码。虽然泛型在运行时会被擦除,但Java提供了足够的机制来确保泛型代码的正确性和效率。

        请注意,这个解释是一个简化的版本,旨在为初学者提供一个泛型的基本概念。在实际应用中,泛型可能会涉及更复杂的概念,如泛型数组、泛型方法的重载、泛型与继承等。如果您需要更深入的理解,建议查阅Java官方文档或相关书籍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring08、使用注解开发

8、使用注解开发 8.1、说明 在spring4之后&#xff0c;想要使用注解形式&#xff0c;必须得要引入aop的包 在配置文件当中&#xff0c;还得要引入一个context约束 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

采用广度优先搜索-BFS遍历图

基本思想 1.建立一个队列 2.把初始顶点加入&#xff0c;此后每次取出队首顶点进行访问 3.把从该顶点出发可以到达的&#xff0c;未曾加入过队列的顶点全部加入队列 4.不断取出&#xff0c;直至队列为空结束 遍历实现 1.邻接矩阵实现 const int maxn100; const int INF10000…

六自由度Stewart平台的matlab模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1运动学原理 4.2 Stewart平台运动学方程 5.完整工程文件 1.课题概述 六自由度Stewart平台的matlab模拟与仿真&#xff0c;模拟六自由度Stewart平台的动态变化情况以及伺服角度。 2.系统仿真结果 3.核…

Linux安装Nginx配置Keepalived高可用

Vmwaire 安装 Linux 解决启动没有IP地址问题 cd /etc/sysconfig/network-scripts vi ifcfg-ens33# 重启linux reboot # 再次查看ip ip addrLinux 镜像地址下载 ps: 发现阿里有一个工具箱&#xff0c;里面有各种镜像 阿里镜像地址 https://developer.aliyun.com/mirror/ 安装…

web学习笔记(二十一)

目录 1.构造函数创建对象 1.1规则 1.2 new关键字调用构造函数时&#xff0c;函数内部做了什么事情&#xff1f; 1.3总结 2.混合模式创建对象 3.JavaScript 继承---借助构造函数 4.原型链 4.1原型链实现方法继承 5.完美的组合继承 6.call方法的使用 1.构造函数创建对象…

【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)

引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 本文快速帮助开发者修改为自己名称的一个国标平台 文章目录 一、 预期效果展示二、 源码修改-前端三、 验证修改效果一、 预期效果展示 二、 源码修改-前端 需要修改的文件位置: 项目工程下web_src目录…

一、深度学习介绍

目录 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

CP AutoSar之LIN Driver详细说明

本文遵循autosar标准&#xff1a;R22-11 1 简介 本文指定了 AUTOSAR 基础软件模块 LIN 驱动程序的功能、API 和配置。 1.1 范围 LIN驱动程序适用于ISO 17987主节点和从节点。AUTOSAR中的LIN实现偏离了本LIN驱动器规范中所述的ISO 17987规范&#xff0c;但LIN总线上的行为不…

搜维尔科技:CATIA为建筑、基础设施和城市规划提供虚拟孪生力量

超越传统项目交付方法限制的协作 复杂建筑和基础设施项目开发的设计和工程流程需要多个利益相关者和所有项目阶段的密切合作。此外&#xff0c;日益复杂的施工项目要求所有团队都依赖 CATIA 和3D EXPERIENCE 虚拟孪生技术作为“通用语言”&#xff0c;以促进协作并减少阶段之间…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

开发前端需求时,我们该如何准确预估个人工时

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习 原文作者&#xff1a;掘金-悟空和大王 前言 分享一篇前端开发人员比较感兴趣的话题&#xff0c;如何评估工时。 领导为什么会压工时&#xff1f; 使他的KPI更好看不清楚做这个东西实际要多长时间因为第2点的原因&…

极狐GitLab 使用指南:开启多种导入导出源

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 极狐GitLab 支持从主流的平台将项目导入到极狐GitLab&#xff…

Qt|QTreewidget类下函数qt助手详解说明示例(上)

该系列持续更新&#xff0c;喜欢请一键三连&#xff0c;感谢各位大佬。 QT5.14.2 参考官方QT助手 文章目录 QTreeWidget ClasspropertiesPublic Functions默认构造函数默认析构函数添加根节点void addTopLevelItem(QTreeWidgetItem *item)添加多个根节点void addTopLevelItems…

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…

从代码到内容:使用C#和Fizzler探索Instagram的深处

文章摘要&#xff1a; Instagram是一个流行的社交媒体平台&#xff0c;拥有数亿的用户和海量的图片和视频内容。如果您想要从Instagram上获取一些有用的信息或数据&#xff0c;您可能需要使用爬虫技术来自动化地抓取和分析网页内容。本文将介绍如何使用C#和Fizzler这两个强大的…

Facebook元宇宙大观:数字化社交的未来愿景

近年来&#xff0c;元宇宙&#xff08;Metaverse&#xff09;概念备受关注&#xff0c;被认为是数字化社交的未来趋势。作为全球领先的社交媒体平台之一&#xff0c;Facebook正积极探索元宇宙的发展路径&#xff0c;构想着一个数字化社交的未来愿景。在本文中&#xff0c;我们将…

FLStudio20.8编曲制作软件中文版下载及功能全面介绍

一、主要功能 FL Studio 20.8&#xff0c;作为一款深受音乐制作人和作曲家喜爱的软件&#xff0c;具备多种核心功能&#xff0c;满足从创作到完成的整个音乐制作流程。 音频录制与编辑&#xff1a;用户可以轻松录制外部音频&#xff0c;如乐器演奏、人声等&#xff0c;并在软…

PBM学习——从基础到精通!!!

本专栏着重讲解PBM学习所得,学习笔记、心得,并附有视频素材资料,视频详细目录如下: PBM相关参数解释1 PBM相关参数解释2 PBM相关案例实践1 PBM相关案例实践2 PBM相关案例实践2 PBM相关案例实践3 PBM多相流中次相界面设置1 PBM多相流中次相界面设置2 欧拉多相流曳力1 欧拉多…