`

泛型:为何List<Driver>非List<Person>子类型

阅读更多

The problem with that intuition is that it assumes that collections don’t change.
Our instinct takes these things to be immutable.
For example, if the department of motor vehicles supplies a list of drivers to the census
bureau, this seems reasonable. We think that a List<Driver> is a List<Person>,
assuming that Driver is a subtype of Person. In fact, what is being passed is a copy
of the registry of drivers. Otherwise, the census bureau could add new people who are
not drivers into the list, corrupting the DMV’s records.

 

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

 

我们直觉认为集合是不可变的,因此直觉倾向于认同X<Integer>是X<Number>的子类型

举例,假设 机动车部门提供了一份驾驶员名单给人口登记局,这貌似是合理的。
我们认为List<Driver> 就是 List<Person>,假设Driver是Person的子类型的话。
但实际上被提交的只是一份驾驶员的登记簿拷贝而已(意思就 是 是可以再改变的),如果不是,人口登记局就可以将那些不是驾驶员的人再加入到这个驾驶员列表中,破坏了机动车部门的记录。

 

这里说的集合不可变,是指集合类型不可变,如果集合类型可变,则X<Integer>不能是X<Number>的子类型

分享到:
评论

相关推荐

    C#重要知识之——泛型列表List例子

    在C#编程中,泛型列表`List&lt;T&gt;`是一个非常重要的数据结构,它为我们提供了动态数组的功能,并且具有类型安全的特性。这篇文章将深入探讨`List&lt;T&gt;`的使用,包括其基本操作、性能特点以及一些高级用法。 一、基础概念...

    C#+List+GridControl实现主从表嵌套

    `List&lt;T&gt;`是.NET Framework中`System.Collections.Generic`命名空间下的一个泛型集合类,它实现了`IList&lt;T&gt;`、`ICollection&lt;T&gt;`和`IEnumerable&lt;T&gt;`接口。`List&lt;T&gt;`是用于存储强类型对象的动态数组,允许快速的插入和...

    arraylist 和 list<T> 效率对比

    在C#编程中,ArrayList和List&lt;T&gt;是两种常见的动态数组类型,它们都在.NET框架的System.Collections命名空间和System.Collections.Generic命名空间下,用于存储和操作对象数组。然而,尽管它们在用途上相似,但两者在...

    json字符串实体bean或者List互转(gson和jackson,支持泛型)

    json字符串实体bean或者List&lt;bean&gt;互转(gson和jackson,支持泛型),支持json的格式化,所需要的包在代码也有说明。还有少的可以告知我,谢谢

    C#List<T>的应用记录

    - 如果需要传递List&lt;T&gt;的副本而非引用,可以使用`List&lt;T&gt;.GetRange`或`List&lt;T&gt;.Clone`等方法创建一个新的List对象。 - 对于希望修改方法参数的场景,通常使用`ref`或`out`关键字,但这些关键字不适用于List&lt;T&gt;的...

    CSharp_List.zip_C# list_C#中list_C#中list的用法_C#怎么引用List_c# list

    在C#编程中,`List&lt;T&gt;`是.NET框架中常用的一种动态数组,它属于泛型集合,提供了丰富的功能,使得在处理一系列数据时更加灵活高效。`List&lt;T&gt;`类是`System.Collections.Generic`命名空间的一部分,它实现了`IList&lt;T&gt;`...

    java实现接口反参JsonData<T>封装,并实现字符串与泛型对象JsonData<T>之间的快速转换

    java实现接口反参JsonData<T>封装,并实现字符串与泛型对象JsonData<T>之间的快速转换封装

    C# xmlToList xml转换成对象

    首先,我们需要理解`List&lt;T&gt;`是C#中的一个泛型集合类,它继承自`Collection&lt;T&gt;`,可以存储同一类型的元素列表。`T`代表你想要存储的对象类型,例如`List&lt;int&gt;`表示存储整数的列表,`List&lt;string&gt;`则表示字符串列表。...

    范型List Dictory增加事件功能

    在.NET框架中,`List&lt;T&gt;`和`Dictionary&lt;TKey, TValue&gt;`是两个常用的数据结构,分别代表泛型列表和泛型字典。它们都是系统提供的高效容器,用于存储和操作对象集合。然而,这两种数据结构在默认情况下并不直接支持...

    List数据绑定

    在.NET框架中,`List&lt;T&gt;`是泛型集合类,它是`System.Collections.Generic`命名空间下的一个重要组件,用于存储一组特定类型的对象。这个类实现了`IList&lt;T&gt;`、`ICollection&lt;T&gt;`和`IEnumerable&lt;T&gt;`接口,使得它具有...

    Json与实体相互转换,支持IList泛型

    Json转换为实体;Json转换为IList&lt;T&gt;;实体转换为Json;IList&lt;T&gt;转换为Json;

    C#中的集合示例(Array,ArrayList,Hashtable,List)

    本篇文章将深入探讨三种常见的集合类型:Array、ArrayList、Hashtable以及泛型的List&lt;T&gt;,并提供相关的示例代码来帮助理解它们的用法。 ### 1. Array(数组) 数组是最基础的集合类型,它允许存储相同类型的元素...

    C# List用法

    C# List&lt;T&gt;是.NET Framework中System.Collections.Generic命名空间下的一个泛型类,它是对非泛型ArrayList类的泛型等效版本,适用于处理强类型集合。List&lt;T&gt;使用动态数组的方式实现,允许元素数量按需动态增加,相比...

    IEnumerable<T>、IEnumerable、ICollection<T>、IList<T>、ObservableCollectin<T>和Collection<T>得关系。

    `IEnumerable&lt;T&gt;`和`IEnumerable`接口的区别在于前者是泛型,后者是为非泛型集合设计的,但两者都支持`foreach`循环遍历。 `ICollection&lt;T&gt;`接口扩展了`IEnumerable&lt;T&gt;`,并引入了对集合大小的访问(`Count`属性)...

    泛型讲解 类型通配符

    4. 泛型方法:使用类型形参定义的方法,例如 `public static void test(List&lt;T&gt; c)`。 泛型的使用: 1. 定义泛型类:`public class Applet&lt;T&gt;{public T info; ...}` 2. 使用泛型类:`Applet&lt;String&gt; applet = new ...

    C# 解析json格式数据为IList

    本文将深入探讨如何在C#中将JSON格式的数据解析为IList&lt;T&gt;类型。 首先,我们需要了解`IList&lt;T&gt;`接口。它是.NET框架中的一部分,定义了一个有序的、可修改的集合,允许索引访问。T代表你想要存储的元素类型。例如,...

    C#源代码-List泛型集合.zip

    在本压缩包"C#源代码-List泛型集合.zip"中,重点聚焦于C#中的`List&lt;T&gt;`类,这是一个非常常用的泛型集合,用于存储同类型的元素序列。`List&lt;T&gt;`是`System.Collections.Generic`命名空间下的一个类,它实现了`IList&lt;T&gt;...

    C#将DataTable转化为List&lt;T&gt;

    在C#开发中,将DataTable转换为List&lt;T&gt;泛型集合是一个常见的需求,特别是在使用三层架构进行网站开发时,我们可能会从数据访问层获取一个DataTable对象,然后需要将其转换为一个强类型的List&lt;T&gt;集合以便在业务逻辑层...

    java泛型总结

    - **定义**: 在方法签名中使用泛型,可以通过在方法签名中添加`&lt;T&gt;`来指定泛型类型,其中`T`是类型变量。 - **示例**: ```java public &lt;T, S, U&gt; U f(T t, S s) { // 方法体 } ``` 在这个例子中,`f`方法接受两个...

Global site tag (gtag.js) - Google Analytics