<< 定义简单泛型 · 目录 · 通配符 >>

泛型和子类型 (Generics and Subtyping)

让我们来测试一下你对泛型的理解。下面的代码段合法吗?

List<String> ls = new ArrayList<String>(); // 1
List<Object> lo = ls; // 2

第1行当然是合法的。比较棘手的是第2行。这归结于一个问题:String List 是 Object List 吗?大多数人凭直觉回答:是!

再看看接下来的几行:

lo.add(new Object()); // 3
String s = ls.get(0); // 4: 尝试将Object分配给String!

这里我们别名化了 ls 和 lo 。通过别名 lo 访问 ls (一个 String List),我们可以向其中插入任意对象。因此 ls 不再只保存String,当我们试图从中得到一些东西时,我们会得到一个“惊喜”。

当然,Java编译器将防止这种情况发生。第2行将导致编译时错误。

通常,如果Foo是Bar的子类型(子类或子接口),而G是泛型类型声明,但 G<Foo> 却不是 G<Bar> 的子类型。这可能是你需要学习的关于泛型的最困难的事情,因为它违背了我们根深蒂固的直觉。

我们不应该假设集合不会改变。我们的本能可能导致我们认为这些事情是不可改变的。

例如,如果 车管所 向 人口普查局 提供一份司机名单,这似乎是合理的。我们认为 List<Driver> 是一个 List<Person> ,假设 Driver 是 Person 的子类型。事实上,被递交的应该是司机名单的副本,否则,人口普查局可能会在名单上增加新的非司机的人口记录从而破坏了车管所的记录。

为了应对这种情况,我们要考虑更灵活的泛型类型。到目前为止,我们所见到的规则是相当严格的。

<< 定义简单泛型 · 目录 · 通配符 >>

本文译自:https://docs.oracle.com/javase/tutorial/extra/generics/subtype.html

转载于:https://my.oschina.net/tita/blog/2886564

[译] 3.泛型和子类型相关推荐

  1. More Effective C# Item3 : 运行时检查泛型参数的类型并提供特定的算法

    我感觉这一条目应该算是对Item2的补充,还是在"约束"的条件下,如何使得程序得到最优化的结果,颇有"带着脚铐跳芭蕾"的意味.Item2中的条目可以看做是在有约 ...

  2. java数组子类型_[改善Java代码]数组的真实类型必须是泛型类型的子类型

    List接口的toArray方法可以把一个结合转化为数组,但是使用不方便,toArray()方法返回的是一个Object数组,所以需要自行转变. toArray(T[] a)虽然返回的是T类型的数组, ...

  3. java泛型程序设计——通配符类型+通配符的超类型限定

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识: [1]通配符类型相关 1. ...

  4. Typescript类,泛型,各种类型工具

    一.TypeScript 类 一个类可以包含以下几个模块: 1.属性 1.1 类属性 1.2 实例属性 2.构造函数(在python中叫初始化函数) 该函数在类实例化时会被立即调用 3.方法(也是函数 ...

  5. ts泛型和补充类型基础

    目录 implements字句 泛型基本使用 泛型约束 泛型接口 泛型类 补充类型 unknown类型 map对象 条件类型 映射类型 implements字句 类可以实现接口,使用笑键字implem ...

  6. 提到“子类”和“子类型”是不同的

    提到"子类"和"子类型"是不同的,替换原则只适合于子类型关系,而一般编程语言只是考虑了子类关系,子类说明了新类是继承自父类,而子类型强调的是新类具有父类一样的行 ...

  7. Java 8新特性探究(6):泛型的目标类型推断

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...

  8. Java通过泛型的模板类型实例化对象

    Java通过泛型的模板类型实例化对象 最近自己研究了下mvvm框架,使用泛型的方式可节省很多代码,并且可以合并很多冗余代码,为了最大化的精简代码想到了通过泛型的type用反射的方式实例化对象,这样对象 ...

  9. 020_泛型变量的类型限定

    1. 泛型变量的类型限定 1.1. 实例 public static <T> T get(T t1,T t2) { if(t1.compareTo(t2) >= 0); // 编译错 ...

最新文章

  1. jquery 对 Json 的各种遍历
  2. Java并发编程—什么是线程?
  3. 如何选择免费网站监测工具?国外mon.itor.us还是国内监控宝!
  4. SAP Marketing Cloud功能简述(二) Target Group
  5. 【期望】路径长度(金牌导航 期望-1)
  6. [jQuery]JQuery一个对象可以同时绑定多个事件,这是如何实现的?
  7. CEPH快速部署(Centos7+Jewel)
  8. Struts2数据封装
  9. Git笔记(14) 分支开发工作流
  10. 小程序入门学习06--data、url传参、调用豆瓣api
  11. type python django models_Django 模型
  12. 无线共存:利用蓝牙和 WiFi 性能特性实现芯片间提权
  13. 剑指 Offer II 110. 所有路径
  14. 001.XE3添加TPerlRegEx
  15. java填空题答案_java练习题附选择填空答案
  16. 运行aspnet时要求启用windows集成身份验证
  17. Screen Orientation for Windows Phone
  18. 利用Email包实现邮件的群收发功能
  19. 轻快PDF阅读器阅读pdf文件步骤
  20. C#中的EXCEL的查找操作

热门文章

  1. 现代信号处理——平稳随机信号
  2. 欧几里得、扩展欧几里得和中国剩余定理
  3. 嘉立创EDA专业版--文件名称修改、原理图尺寸修改与文本放置
  4. dropdownlist下拉框变透明_Unity3D 4.x利用原生UGUI完成下拉列表DropDownList
  5. 学习笔记——CDQ分治
  6. 升级nodejs和npm到最新版
  7. | JavaScript脚本注入,完成Selenium 无法做到的那些事
  8. 嵌入式arm linux工控机,ARM工控机和X86嵌入式工控机的区别
  9. 【集合】--List
  10. 项目案例:网上书店数据库设计