博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于List、List<?>、List<Object>的区别
阅读量:5924 次
发布时间:2019-06-19

本文共 1646 字,大约阅读时间需要 5 分钟。

定义:声明中具有一个或者多个类型参数(type parameter)的类或者接口,就是泛型类或者接口。泛型类和接口统称为泛型(generic type)

clipboard.png

每种泛型定义一组类型形参(formal type parameters),这些类型形参有时也被简称为类型参数(type parameter),例如对于泛型(generic type)List<E>而言,List<String>就是一个参数化的类型(parameterized type),String就是对应于类型形参(formal type parameters)类型实参(actual type parameter)

每个泛型定义一个原生类型(raw type),即不带任何类型参数的类型名称,例如,与List<String>对应的原生类型是List。原生类型就像从类型声明中删除了所有泛型信息一样。实际上原生类型List与Java平台在有泛型之前的接口类型List完全一样。

容器类使用泛型的好处:

  • 安全性:在对参数化类型的容器中放入了错误即不匹配的类型的时候,编译器将会强制性进行错误提示。
  • 便利性:当从容器中取出元素的时候不用自己手动将Object转换为元素的实际类型了,编译器将隐式地进行自动转换。
  • 表述性:带有类型实参的泛型即参数化类型,可以让人看到实参就知道里面的元素E都是什么类型。

所以,不应该使用原生类型的原因如下:

虽然使用原生类型是合法的,但不提倡这样做,因为如果使用原生类型,就失掉了泛型在安全性和表述性方面的所有优势;安全性:比如我们可能会不小心把一个java.util.Date实例错误地放进一个原本包含java.sql.Date实例的集合当中,虽然在编译期不会出现任何错误,但在运行期一旦尝试类型转换就会发生ClassCastException,而泛型原本就是为了避免这种问题而出现的;表述性:不像带有类型实参的泛型即参数化类型那样,让人看到实参就知道里面的元素E都是什么类型。

泛型的子类型化的原则:List<String>类型是原生类型List的一个子类型,而不是参数化类型List<Object>的子类型

List、List<?>、List<Object>的区别

  • List,即原始类型,其引用变量可以接受任何对应List<E>的参数化类型, 包括List<?>,并且可以添加任意类型的元素。但其缺点在于不安全性、不便利性、不表述性(不应该使用原生类型的原因)。
  • List<?>,即通配符类型,其引用变量,同样可以接受任何对应List<E>的参数化类型,包括List,但不能添加任何元素,保证了安全性和表述性。但不具有表述性,从中取出的元素时Object类型,要通过手动转换才能得到原本的类型。
  • List<Object>,即实际类型参数为Object的参数化类型,其引用变量可以接受List,可以添加元素,但不能接受除了其本身外的任何参数化类型(泛型的子类型化原则)。
引用变量的类型 名称 可以接受的类型 能否添加元素 安全性 便利性 表述性
List 原始类型 任何对应List<E>的参数化类型, 包括List<?> 可以添加任意类型的元素
List<?> 通配符类型 以接受任何对应List<E>的参数化类型,包括List 不能添加任何元素
List<Object> 实际类型参数为Object的参数化类型 仅可以接受List和其本身类型 可以添加任意类型元素

可以看到相比参数化类型的List<Object>,List<?>缺点在于不能添加任何元素并且不具有便利性,如果这无法满足功能要求可以考虑使用泛型方法和有边界的通配符。

根据The Java™ Tutorials,原生类型对象可以被赋给参数化类型(包括有界无界通配符参数化类型),同样,参数化类型(包括有界无界通配符参数化类型)对象也能被赋给原生类型

参考:《effective java》

转载地址:http://smavx.baihongyu.com/

你可能感兴趣的文章
详解用65行javascript代码做Flappy Bird
查看>>
SVN就是这么简单
查看>>
关于响应式布局,你必须要知道的
查看>>
Mobx 与 Redux 的性能对比
查看>>
vue-cli 3.0配置webpack目录别名alias
查看>>
web布局固定宽度+变化宽度实现思路
查看>>
微信小程序黑客马拉松即将开始,来做最酷的 Mini Program Creators!
查看>>
前端工程化:围绕Jenkins打造工作流的过程
查看>>
前端技术周刊 2018-12-03:DOM
查看>>
搭建 vue2 单元测试环境(karma+mocha+webpack3)
查看>>
Unity 游戏框架搭建 (九) 减少加班利器-QConsole
查看>>
Safari 版本回退方法
查看>>
Android 4 +https(如何启动TLS1 1 and TLS1 2)
查看>>
从shiro源码角度学习工厂方法设计模式
查看>>
python面试题~反射,元类,单例
查看>>
java多线程编程——锁优化
查看>>
写一个易于维护使用方便性能可靠的Hybrid框架(一)—— 思路构建
查看>>
为什么阿里巴巴禁止把SimpleDateFormat定义为static类型的?
查看>>
ResourceManager中的Resource Estimator框架介绍与算法剖析
查看>>
5分钟内看懂机器学习和深度学习的区别
查看>>