Java中List<T>和List<?>的区别【转载】

`

List、List<?>、List这三者都可以容纳所有的对象,但使用的顺序应该是首选List,次之List<?>,最后选择List,原因如下:

(1) List是确定的某一个类型

List表示的是List集合中的元素都为T类型,具体类型在运行期决定;List<?>表示 的是任意类型,与List类似,而List则表示List集合中的所有元素为Object类 型,因为Object是所有类的父类,所以LiSt也可以容纳所有的类类型,从这一字面 意义上分析,List更符合习惯:编码者知道它是某一个类型,只是在运行期才确定而已。

(2) List可以进行读写操作

List可以进行诸如add、remove等操作,因为它的类型是固定的T类型,在编码期 不需要进行任何的转型操作。

List<?>是只读类型的,不能进行增加、修改操作,因为编译器不知道List中容纳的是 什么类型的元素,也就无毕校验类型是否安全了,而且List<?>读取出的元素都是Object类 型的,需要主动转型,所以它经常用于泛型方法的返回值。注意,List<?>虽然无法增加、修 改元素,但是却可以删除元素,比如执行remove、clear等方法,那是因为它的删除动作与泛型类型无关

List也可以读写操作,但是它执行写入操作时需要向上转型(Upcast),在读 取数据后需要向下转型(Downcast),而此时已经失去了泛型存在的意义了。

打个比方,有一个篮子用来容纳物品,List的意思是说,“嘿,我这里有一个篮子, 可以容纳固定类别的东西,比如西瓜、番茄等”。List<?>的意思是说“嘿,我也有一个篮子, 我可以容纳任何东西,只要是你想得到的”。而List就更有意思了,它说“嘿,我 也有一个篮子,我可以容纳所有物质,只要你认为是物质的东西就都可以容纳进来”。

推而广之,Dao应该比Dao<?>、Dao更先采用,Desc则比Desc<?>、Desc 更优先采用。

Original: https://www.cnblogs.com/fb010001/p/15949414.html
Author: 方斌
Title: Java中List<T>和List<?>的区别【转载】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/586183/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 007 Linux 命令三剑客之-awk

    Linux 命令三剑客,sed、grep、awk。 sed:擅长数据修改。 grep:擅长数据查找定位。 awk:擅长数据切片,数据格式化,功能最复杂。 awk 更适合格式化文本,…

    Linux 2023年5月27日
    095
  • Linux进度条制作

    进度条 先了解一下/r 的用法 /r 讲光标回到当前行的最开始 4 int main() 5 { 6 int i=0; 7 for(i=0;i10;i++) 8 { 9 print…

    Linux 2023年6月13日
    096
  • 斐波那契数列前1000项

    斐波那契数列前1000项 {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,177…

    Linux 2023年6月6日
    097
  • ElasticSearch & kibana安装

    ElasticSearch ElasticSearch 简介 ElasticSearch 概念 ElasticSearch quick start docker安装ElasticS…

    Linux 2023年6月13日
    0131
  • 巧用 JuiceFS Sync 命令跨云迁移和同步数据

    近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移…

    Linux 2023年6月14日
    0110
  • 【电子取证:镜像仿真篇】Windows Server镜像仿真、vmdk镜像仿真

    Windows Server镜像仿真、vmdk镜像仿真 时间过得真快呀!–【suy999】 一、qemu-img镜像转换工具 qemu-img(v2.3.0.0)镜像转…

    Linux 2023年6月13日
    0107
  • 华为ensp网络拓扑图使用MSTP、OSPF、DHCP、端口聚合以及PPP(CHAP认证)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0105
  • IDEA如何切换到括号外

    一般我们输入完括号后都会习惯性Enter或者Shift + Enter切换到括号外,结果却变成了: public void nothing() Enter → public voi…

    Linux 2023年6月13日
    095
  • 在Windows平台用Visual C++ 2022 (v143)编译PDCurses

    综述 PDCurses是一个开源的跨平台curses库,它提供了一组函数,开发者可以用这组函数在终端(Console、Terminal)上设置光标的位置和字符的显示样式。本文介绍在…

    Linux 2023年6月8日
    0121
  • 模型层

    准备阶段 django自带的sqlite3数据库,功能很少,并且针对日期类型不精确 准备步骤 数据库正向迁移命令(将类操作映射到表中) python3 manage.py make…

    Linux 2023年6月7日
    097
  • MACOS Terminal终端:更改zsh模式到bash模式(切换shell)

    MACOS Terminal终端:更改zsh模式到bash模式(切换shell) 一、GUI界面切换: preferences… -> shell open wi…

    Linux 2023年5月28日
    0179
  • Ubuntu常用命令

    Ubuntu(18.04)下更改用户名和主机名 更改主机名字: (1)修改hostname文件 这个文件中的内容是用来显示主机名的,修改这个文件后,立刻重启 (2)修改hosts文…

    Linux 2023年6月13日
    093
  • 学习一下 SpringCloud (三)– 服务调用、负载均衡 Ribbon、OpenFeign

    (1) 相关博文地址: 学习一下 SpringCloud (一)– 从单体架构到微服务架构、代码拆分(maven 聚合): https://www.cnblogs.com/l-y…

    Linux 2023年6月11日
    093
  • 实验一-密码引擎-加密API研究

    任务详情密码引擎API的主要标准和规范包括:1 微软的Crypto API2 RAS公司的PKCS#11标准3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接…

    Linux 2023年6月8日
    0115
  • 【5】2022年7月

    7月3日 总结3号的一天就是只有一句话,”自己经历了什么只有自己最清楚,不要辜负自己经历的”。 7月3号凌晨2点,收拾好行李和整理房间,在网上购买日常用品到…

    Linux 2023年6月13日
    087
  • Java秒杀系统一:环境搭建和DAO层设计

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0126
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球