【Java基础面试题033】Java泛型的作用是什么?

news2024/12/24 23:53:59

Java的基础语法可以看尚硅谷的这个PDF:尚硅谷JavaSE基础/《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf · Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com)

回答重点

Java泛型的作用是通过在编译时检查类型安全,允许程序员编写更通用和灵活的代码,避免在运行时发生类型转换错误。

总结作用

  • 类型安全:泛型允许在编译时进行类型检查,确保在使用集合或其他泛型类时,不会出现类型不匹配的问题,减少了运行时的ClassCastException错误
  • 代码重用:泛型使代码可以适用于多种不同的类型,减少代码重复,提升可读性和可维护性
  • 消除显式类型转换:泛型允许在编译时指定类型参数,从而消除了运行时需要显式类型转换的麻烦
List<String> list = new ArrayList<>();
list.add("Hello");
String str = list.get(0); // 不需要类型转换

扩展知识

泛型的实际应用

  • 集合框架:Java的集合框架广泛使用了泛型。List<T>、Set<T>和Map<K, V>等接口可以针对不同的数据类型实现统一的操作
  • 泛型方法:不仅可以定义泛型类,还可以定义泛型方法,使得方法能够处理多种不同的数据类型

  • 泛型方法

可以显式指定类型,不指定的话,Java编译器会自动推断类型

public class GenericMethodTest {
    public static void main(String[] args) {
        Integer[] intArr = {1, 2, 3, 4, 5};
        Double[] doubleArr = {1.1, 2.2, 3.3, 4.4, 5.5};
        String[] stringArr = {"Hello", "World"};
        printArray(intArr);
        // 显式指定类型
        GenericMethodTest.<Integer>printArray(intArr);
        printArray(doubleArr);
        printArray(stringArr);
        // 多类型参数
        new GenericMethodTest().printMultiArgsArray(intArr, stringArr);
    }
    public static <T> void printArray(T[] arr){
        for (T element: arr){
            System.out.print(element);
        }
        System.out.println();
    }
    // 多类型参数
    public <T, V> void printMultiArgsArray(T[] keys, V[] values){
        for (int i = 0; i < Math.min(keys.length, values.length); i++){
            System.out.printf("{Key:%s,Value:%s}\n", keys[i], values[i]);
        }
    }
}

为什么需要泛型?

在Java5之前是没有泛型的,没泛型都能用的好好的,为什么非要加个泛型呢?能解决什么问题呢?

看这段代码

  List list = new ArrayList();
  list.add("yes"); // 加入string
  list.add(233); // 加入int

在没有泛型的时候,加入的集合的数据并不会做任何约束,都会被当做成Object类型。

可能有人说:这很好呀,多自由!确实,自由是挺自由,但是代码的约束力越低,越容易从出错,使用上也有诸多不便。比如获取的时候老是要强转

就算强转过了编译器这一关,运行的时候还是会报错

综上,Java就引入了泛型。

所以泛型的作用就是加了一层约束,约束了类型。

有了这一层约束就好办事了,由于声明了类型,可以在编译时就识别不出准确的类型元素。使得错误提早抛出,避免运行时才发现。

小结一下泛型的好处:

  • 提高了代码的可读性,一眼就能看出集合的类型
  • 可在编译期检查类型的安全,增加程序的健壮性
  • 省心不需要强转(其实内部帮做了强转,下面会说)
  • 提高代码的复用率,定义好泛型,一个方法(类)就能适配所有类型(其实以前Object也行,就是比较麻烦)

为什么Java的泛型是伪泛型?

public class GenericReflectionTest {
    public static void main(String[] args) throws Exception{
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.getClass().getMethod("add", Object.class).invoke(list, 123);
        System.out.println(list);
    }
}

可以看到,我声明的是一个String类型的集合,但是通过反射往集合中插入了int类型的数据,居然成功了?

这说明在运行的时候泛型根本没起作用!也就是说在运行的时候JVM获取不到泛型的信息,也不会对其做任何约束

可以认为Java的泛型就是编译时失效,运行的时候就是没有泛型,所以大家才说Java是伪泛型!

因此,实际上在运行的时候泛型的类型是被擦除

总结:Java的泛型只在编译时生效,JVM运行时没有泛型

关于反射的博客,看我这一篇:【Java】反射_反射 博客园-CSDN博客

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

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

相关文章

如何永久解决Apache Struts文件上传漏洞

Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来&#xff0c;就存在多个版本的漏洞&#xff0c;其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制&#xff0c;从而上传恶意文件。虽然每次官方都发布补丁进行修…

重生之我在异世界学编程之C语言:深入动态内存管理收尾 + 柔性数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文常见的动态内存管理错误&#xf…

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

apisix转发websocket

1、说明 apisix网关对接websocket&#xff0c;参数以及使用可以看官方文档 WebSocket Authentication | Apache APISIX -- Cloud-Native API Gateway 注意事项&#xff1a; &#xff08;1&#xff09;官方文档是websocket要加认证&#xff0c;但自测发现可以不加认证插件 …

【unity】【游戏开发】Unity项目一运行就蓝屏报Watch Dog Timeout

【背景】 由于是蓝屏所以没法截屏&#xff0c;总之今天遇到了一开Unity&#xff0c;过一阵就蓝屏的情况&#xff0c;报Watch Dog Timeout。 【分析】 通过任务管理器查看&#xff0c;发现Unity占用率100%&#xff0c;再观察Unity内部&#xff0c;每次右下角出现一个Global I…

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用(2024/12/12补充)

最终效果 文章目录 最终效果更好的方式&#xff08;2024/12/12补充&#xff09;前言为什么使用CharacterControllerSimpleMove和Move如何选择&#xff1f;1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃方式一方式二 下蹲处理下坡抖动问题实现奔跑和不同移…

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

使用 UniApp 在微信小程序中实现 SSE 流式响应

概述 服务端发送事件&#xff08;Server-Sent Events, SSE&#xff09;是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道&#xff0c;服务器可以持续地向客户端发送数据&#xff0c;而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入&#xff0c;信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具&#xff0c;在汽车制造行业中发挥着重要作用。本文将结合…

Unity DOTS中的share component

Unity DOTS中的share component 内存管理创建流程修改流程销毁流程Reference share component是DOTS中一类比较特殊的component&#xff0c;顾名思义&#xff0c;它是全局共享的component&#xff0c;所有具有相同component值的entity&#xff0c;共享一个component&#xff0c…

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列&#xff1a;外连接转内连接的常见场景与错误》一文中&#xff0c;我们了解到谓词条件可以过滤掉连接结果中的 null 情形的&#xff0c;将外连接转化为内连接的做法是可行的&#xff0c;正如图1中路径(a)所示。此时&#xff0c;敏锐的你或许会进一步思考&#…

Facebook的去中心化探索:社交平台的新型发展趋势

随着数字化进程的加速&#xff0c;社交平台的架构正在经历一场深刻的变革。从最初的集中的社交网络到如今去中心化的构想&#xff0c;社交平台正在朝着更加透明、开放和用户主导的方向发展。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;也在…

Facebook 与数字社交的未来走向

随着数字技术的飞速发展&#xff0c;社交平台的角色和形式也在不断演变。作为全球最大社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在推动数字社交的进程中扮演了至关重要的角色。然而&#xff0c;随着互联网的去中心化趋势和新技术的崛起&#xff0c;Face…

LeetCode:222.完全二叉树节点的数量

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;222.完全二叉树节点的数量 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二…

python+opencv+棋盘格实现相机标定及相对位姿估计

pythonopencv棋盘格实现相机标定及相对位姿估计 引言1&#xff0c;使用相机采集含棋盘格图像14张2&#xff0c;进行相机标定&#xff08;1&#xff09;测试软件1标定结果&#xff08;内参及畸变系数&#xff09;&#xff08;2&#xff09;测试软件2标定结果&#xff08;内参及畸…

Vue(四)

1.Vuex 1.1 Vuex是什么 Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据。例如&#xff1a;购物车数据、个人信息数据。 1.2 vuex的使用 1.安装 vuex 安装 vuex 与 vue-router 类似&#xff0c;vuex 是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 v…

ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用

在这篇文章《ShardingSphereProxy:快速入门》中&#xff0c;我们介绍了如何通过 Navicat 连接 ShardingSphere-Proxy。 实际上&#xff0c;ShardingSphere-Proxy 兼容标准的 SQL 和原生数据库协议&#xff0c;因此你可以使用任何 MySQL 客户端与其进行连接&#xff0c;包括 Go…

芝法酱学习笔记(2.2)——sql性能优化2

一、前言 在上一节中&#xff0c;我们使用实验的方式&#xff0c;验证了销售单报表的一些sql性能优化的猜想。但实验结果出乎我们的意料&#xff0c;首先是时间查询使用char和datetime相比&#xff0c;char可能更快&#xff0c;使用bigint&#xff08;转为秒&#xff09;和cha…