1.数组提供了运行时的类型安全,但是没有编译时的类型安全检测;而泛型提供了编译时类型安全检查,运行时进行类型擦除。
如下代码:
Object[] longArray = new Long[1]; longArray[0]="I am test";
编译可以通过,但是运行的时候会抛出:java.lang.ArrayStoreException异常。
而如下代码:
List<Object> list = new ArrayList<Long>(); //Type mismatch: cannot convert //from ArrayList<Long> to List<Object> list.add("I am test");
编译时就通不过,因为泛型不支持子类化。
2.由于1的根本区别,因此数组和泛型不能很好的混合使用。
因此创建泛型数组(new List<E>[]),创建参数化类型数组(new List<String>[]),创建类型参数数组(new E())都是非法的。
3.题外话
像E,List<E>,List<String>这样的类型应该称作”不可具体化类型(non-reifiable)"。不可具体化类型可形象的理解为:其运行时表示法包含的信息比它编译时表示法包含的信息更少的类型。唯一可具体化的参数化类型是无限制的通配符类型,如List<?>和Map<?,?>。虽然不常用,但是创建无限制通配符类型数组是合法的。
4.补充
由于每次调用可变参数都会创建一个数组来存放可变的参数。如果这个数组的元素类型是不可具体化的,就会得到一个警告。对于这个警告的处理除了@SuppressWarning把它禁止之外,就是避免在API中混合使用泛型与可变参数。
最后当你获得一个创建泛型数组错误时,最好的解决办法就是优先使用集合类型List<E>或者Object[],而不是数组类型E[]。
参考文档:http://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html
相关推荐
在编程领域,数组、泛型、字典表(又称哈希表)是数据结构与算法中的基础概念,它们在存储和操作数据时起着至关重要的作用。以下是关于这些概念的详细说明: 1. **数组**:数组是一种线性数据结构,它包含固定数量...
首先,让我们看看数组和泛型的关系。数组相比于 Java 类库中的容器类是比较特殊的,主要体现在三个方面:数组创建后大小固定,但效率更高;数组能追踪它内部保存的元素的具体类型,插入的元素类型会在编译期得到检查...
此外,数组和泛型集合都支持迭代,可以方便地遍历所有学生进行操作。 总之,泛型集合和数组都是C#中强大的工具,根据具体的需求和场景选择合适的数据结构是优化程序性能的关键。在实际编程中,我们需要充分理解和...
本实例重点讲解了泛型顺序队列和泛型循环队列,这两种队列都是C#中实现队列数据结构的有效方式。 首先,泛型在编程中是指能够处理多种数据类型的类、接口或方法。在C#中,我们可以通过使用`<T>`来声明一个泛型类型...
通过一维数组、多维数组和泛型的深入理解和实践,可以更好地理解和处理数据集合。枚举的理解和使用则有助于编写更加清晰和严谨的代码。在实际编程中,数组和泛型集合常用于数据处理和存储,而枚举则常见于定义固定...
Java编程语言中,数组、泛型和集合是重要的数据组织工具,它们都在多态环境中有着广泛的应用。本文将深入探讨这三个概念在多态中的使用方式以及它们之间的对比。 首先,我们来看**数组**在多态中的应用。在Java中,...
C#【泛型】实现的【通用】结构体转字节数组,包含网上收集的网页参考资料、非通用的【StructTest】工程、泛型实现的通用【Struct2BytesGenericType】工程。 VS2010编译运行。
"实例185 - 自定义泛型化数组类"是一个关于如何创建和使用自定义泛型数组类的示例,这个主题将深入探讨泛型、数组以及两者的结合。 首先,我们需要理解泛型的基本概念。泛型是Java 5引入的一个重要特性,它允许我们...
因此,数组和泛型的交互需要特别处理。 9. **Class字面量作为运行时类型标记**:在泛型中,Class对象可以用作运行时的类型标记,以获取泛型信息,这在某些情况下是必要的,因为类型信息在编译后被擦除。 10. **...
在Java编程中,"泛型自定义数组大小"是一个重要的概念,它涉及到数据结构和算法的基础,以及面向对象编程中的类型安全。泛型是Java 5引入的一个特性,旨在提高代码的类型安全性,减少类型转换的冗余,并提供编译时的...
servlet类向jsp传递带泛型数组。泛型为自定义的bean
泛型动态数组泛型动态数组
本教程将介绍Java泛型的基础知识,包括泛型类和接口、类型参数、泛型方法、通配符类型、类型擦除以及泛型与数组的关系等。 ### 泛型类和接口 在Java中,类或接口可以通过声明类型参数来创建泛型类或接口。类型参数...
Java 封装数组之改进为泛型数组操作详解 Java 封装数组之改进为泛型数组操作是 Java 语言中的一种重要技术,旨在将基本类型数组封装为泛型数组,以提供...但是,需要注意泛型数组的使用规则和注意事项,以免出现错误。
总之,Java不支持创建泛型数组是因为其类型系统的限制,主要是为了维护类型安全和向后兼容。程序员可以通过使用集合框架,或者使用对象数组和类型转换来实现类似的功能。理解这个限制以及其背后的原因,是每个Java...
泛型数组的排序是常见的编程任务,尤其在处理大量数据时,高效且类型安全的排序至关重要。本文将深入探讨如何在C#中使用泛型和数组排序,并结合面向对象原则,尤其是ASP.NET和.NET框架中的相关概念。 首先,我们...
### Java 泛型数组的理解与应用 #### 一、引言 Java 泛型是 Java SE 5.0 引入的新特性,它允许在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。然而,在 Java 中创建泛型数组却...
- 数组与泛型集合:对比数组和泛型集合,理解其优缺点。 - LINQ(Language Integrated Query):学习查询表达式,提高数据处理效率。 5. **多线程与并发** - 线程:创建和管理线程,理解线程同步与互斥。 - ...
这使您可以创建能够使用相同代码循环访问数组和其他集合类型的泛型方法。此技术主要对读取集合中的数据很有用。IList<T> 接口不能用于在数组中添加或移除元素;如果试图在此上下文中调用 IList<T> 方法(如数组的 ...
3. **数组和泛型的区别**:数组在处理子类型时的行为与泛型不同。如果A是B的子类型,那么A[]就是B[]的子类型。因此,一个Apple数组可以赋值给Fruit数组,但反过来不行,因为这可能导致类型不匹配的元素被添加到数组...