栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中的泛型/类型擦除/通配符

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的泛型/类型擦除/通配符

1.泛型是如何工作的?

泛型是通过类型擦除来实现的.
编译器在编译时,擦除了所有类型相关的信息.
运行时不存在任何类型相关的信息.
例如:List 在运行时仅用一个 List 来表示。
这样做的目的,是确保能和 Java 5 之前的版本开发二进制类库进行兼容。

2.什么是类型擦除?

泛型信息只存在于代码编译阶段,在进入JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。
在泛型类被类型擦除的时候,如果类型参数没有指定上限,如 < T > 会被转译成普通的 Object 类型,如果指定了上限如 < T extends String > 则类型参数就被替换成类型上限。

3.List list = new ArrayList();
  • 两个 String 只有第一个起作用,只不过JDK7 才开始支持 List list=new ArrayList<> ();这种写法。
  • 第一个String就是告诉编译器,List 中存储的是String对象,也就是起类型检查的作用,之后编译器会擦除泛型占位符,以保证兼容以前的代码。
4.泛型中的限定通配符和非限定通配符
  • < ? > 表示了非限定通配符,因为 < ? > 可以用任意类型来替代。

限定通配符对类型进行了限制。有两种限定通配符.

  • < ? extends T > 通过确保类型必须是T的子类来设定类型的上界,
  • < ? super T >通过确保类型必须是T的父类来设定类型的下界。

List< ? extends T > 可以接受任何继承自 T 的类型的 List,
List < ? super T > 可以接受任何 T 的父类构成的 List。

例如 List< ? extends Number > 可以接受 List< Integer > 或 List< Float > 。
Array 不支持泛型,要用List 代替 Array,List 可以提供编译器的类型安全保证,而 Array却不能。

泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号