`
- 浏览:
26714 次
- 性别:
- 来自:
杭州
-
在Java中,大家比较熟悉的是通过继承机制而产生的类型体系结构。比如String继承自Object。根据Liskov替换原则,子类是可以替换父类的。当需要Object类的引用的时候,如果传入一个String对象是没有任何问题的。但是反过来的话,即用父类的引用替换子类引用的时候,就需要进行强制类型转换。编译器并不能保证运行时刻这种转换一定是合法的。这种自动的子类替换父类的类型转换机制,对于数组也是适用的。 String[]可以替换Object[]。但是泛型的引入,对于这个类型系统产生了一定的影响。正如前面提到的List<String>是不能替换掉List<Object>的。
引入泛型之后的类型系统增加了两个维度:一个是类型参数自身的继承体系结构,另外一个是泛型类或接口自身的继承体系结构。第一个指的是对于 List<String>和List<Object>这样的情况,类型参数String是继承自Object的。而第二种指的是 List接口继承自Collection接口。对于这个类型系统,有如下的一些规则:
- 相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。即List<String>是Collection<String> 的子类型,List<String>可以替换Collection<String>。这种情况也适用于带有上下界的类型声明。
- 当泛型类的类型声明中使用了通配符的时候, 其子类型可以在两个维度上分别展开。如对Collection<? extends Number>来说,其子类型可以在Collection这个维度上展开,即List<? extends Number>和Set<? extends Number>等;也可以在Number这个层次上展开,即Collection<Double>和 Collection<Integer>等。如此循环下去,ArrayList<Long>和 HashSet<Double>等也都算是Collection<? extends Number>的子类型。
- 如果泛型类中包含多个类型参数,则对于每个类型参数分别应用上面的规则。
理解了上面的规则之后,就可以很容易的修正实例分析中给出的代码了。只需要把List<Object>改成List<?>即可。List<String>是List<?>的子类型,因此传递参数时不会发生错误。但是List<?>并不等同于List<Object>。List<Object>实际上确定了List中包含的是Object及其子类,在使用的时候都可以通过Object来进行引用。而List<?>则其中所包含的元素类型是不确定。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
"Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...
Java泛型是Java编程语言中的一个关键特性,它允许在定义类、接口和方法时使用类型参数,从而创建可重用的代码模板。这个“JavaToJson-JsonToJava”项目显然是一个利用Java泛型实现的工具,用于方便地在Java对象和...
Java泛型是Java语言的一个重要特性,它允许在类、接口和方法中声明类型参数,从而提高了代码的复用性和安全性。这个特性自Java 5引入以来,极大地改善了Java的类型系统,降低了类型转换异常的风险。 1. **使用泛型...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...
5. **类型擦除**:Java泛型的一个重要特性是类型擦除。这意味着在编译后的字节码中,所有的类型参数都会被替换为它们的边界或者`Object`,这使得泛型在运行时不直接存在。因此,泛型的主要好处体现在编译时类型检查...
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
4. **类型擦除:**Java泛型在编译后会执行类型擦除,也就是说在运行时所有的泛型信息都会被消除,替换为实际的类型。因此,泛型不提供运行时的类型检查,但它们确实提供了编译时的类型检查。 5. **并发与集合:**在...
Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...
Java5.0泛型编程是Java开发中的一个重要里程碑,它引入了一种强大的类型系统机制,大大增强了代码的类型安全性,并减少了在编译期间和运行时出现的类型转换错误。这一特性使得开发者能够在编写代码时就能明确指定...
Java泛型是自Java 5引入的一种类型安全机制,它允许在编译时检查类型,从而避免了类型转换异常。泛型主要应用于类、接口和方法。 1. **泛型类**: 定义泛型类时,可以使用尖括号来声明类型参数,如`class Container...
Java基础知识-day02【Collection、泛型】 本节课程主要讲解了 Java 中的 Collection 框架和泛型,涵盖了...本节课程为初学者提供了 Java 中 Collection 框架和泛型的基本概念和使用方法,为他们提供了系统的学习基础。
本书系统地介绍了Java泛型的基础知识、高级特性以及集合框架的使用方法,旨在帮助开发者更好地理解和运用这些核心概念,提升代码质量和程序性能。 ### 泛型基础 #### 1.1 泛型 Java中的泛型是一种类型安全机制,...
Java学习笔记是专门为Java初学者设计的一套详尽的学习资源,旨在帮助新手快速掌握这门广泛使用的编程语言。这份笔记涵盖了从基础概念到高级特性的全面内容,是学习和复习Java知识的理想工具。 1. **Java简介** ...
8. **Java第11章 - 泛型与枚举**:泛型提供了一种在编译时检查类型安全的方式,枚举则用于定义固定的常量集合。这两部分内容提升了代码的类型安全性和可读性。 9. **Java第12章 - 文件与XML处理**:本章深入探讨了...
泛型是Java 5引入的新特性,它增强了类型安全性和代码可读性。泛型允许我们在类、接口和方法中定义参数化的类型,以限制可以传递的数据类型。例如,`List<String>`确保列表只能包含字符串,避免了强制类型转换和可能...
泛型是Java 5引入的新特性,它增强了代码的类型安全性和可读性。泛型允许我们在定义类、接口、方法时指定参数类型,这样在编译时就能检测到错误,避免了类型转换的麻烦。泛型的边界、通配符和擦除也是需要深入理解...
通过这套“JAVA课程PPT”,学习者可以系统地学习Java语言,并逐步提升到能够开发实际项目的水平。每个主题都涵盖了理论知识和实践案例,确保理论与实践相结合,帮助学习者扎实掌握Java编程技能。无论是为了就业还是...
总的来说,这份"JAVA学习资料-高级篇"涵盖了Java多线程、集合框架、反射、I/O流、异常处理、泛型以及模块化等多个核心主题。通过深入学习这些内容,有经验的JAVA开发人员能够进一步提升自己的专业水平,更好地应对...
8. **泛型**:Java泛型提供了一种在编译时检查类型安全的方式,可以避免强制类型转换,并提高代码的可读性和复用性。 9. **Java Swing和JavaFX**:这两个是Java的图形用户界面(GUI)工具包,用于构建桌面应用程序...
- **泛型引入**:为了解决类型安全问题,Java 5引入了泛型。 - **泛型约束**:定义类型参数时可以设置边界,如 `<T extends Number>`。 - **通配符**:?表示任意类型,? extends T表示T或其子类型,? super T表示...