`
matchless1688
  • 浏览: 26310 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java协变

阅读更多
在java中支持协变的有两种情况:
1、数组 A是B的超类,则A【】也是B【】的超类,所有用到A【】的地方都可以用B【】替换
2、允许 子类的覆盖父类函数的返回值类型 是父类被覆盖返回值类型 的子类

在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。

另外,实践表明,就算返回的两个类继承自同一个interface,也无法进行协变。

泛型不支持协变,A是B的超类,List<A>、Set<A>等地方并不能用List<B>、Set<B>来替换。
分享到:
评论

相关推荐

    JAVA可变(协变)返回类型

    在Java编程语言中,"可变(协变)返回类型"是一个重要的概念,它涉及到泛型和类型安全。本文将深入探讨这个主题,并结合提供的`Test.java`文件,来理解如何在实际编程中应用协变返回类型。 首先,我们要明白什么是...

    java协变返回类型使用示例

    在Java编程语言中,协变返回类型是一种特性,它允许子类在重写父类方法时,返回一个比父类方法更具体的类型。这在某些情况下可以提高代码的灵活性和可读性。Java 5.0及后续版本开始支持这种协变特性。下面将详细解释...

    Java中数组协变和范型不变性踩坑记录

    在Java中,数组是协变的,这是由于历史原因,也带来了一些潜在的风险。例如,`Carrot[]`可以被视为`Vegetable[]`的子类。这允许我们将`Carrot[]`赋值给`Vegetable[]`类型的变量,如下所示: ```java Vegetable[] ...

    dotnet 5 从 IL 层面分析协变返回类型新特性.rar

    本教程将重点关注其中的一个重要特性——协变返回类型,从IL(Intermediate Language)层面进行深入剖析。IL是.NET Framework中的中间语言,是源代码编译后的产物,用于跨平台执行。了解IL有助于我们理解.NET框架的...

    java学习资料/笔记整理(一)

    本文将深入探讨“java学习资料/笔记整理(一)”中涉及的重要知识点,包括Java编程思想、类型协变、查询手册以及数据结构与算法。 首先,Java编程思想是理解Java核心概念的关键。这通常涉及到面向对象编程(OOP)...

    C#逆变与协变详解

    在Java中同样存在逆变与协变,后续我还会写一篇Java逆变协变的文章,有兴趣的朋友可以关注一下。 逆变与协变,听起来很抽象、高深,其实很简单。看下面的代码: class Person { } class Student : Person { } ...

    the java programming language fourth editionArnoldGoslingHolmes06

    4. 涵盖了所有新的语言特性,包括自动装箱、可变参数方法、增强的for循环以及协变返回类型。 5. 引入了关键的新类,如Formatter和Scanner。 这本书不仅是一个权威的Java语言教程,同时也是一本不可或缺的参考书,...

    新JEP将简化Java类型变异

    新的JEP Candidate 旨在简化处理Java中复杂的类型变异的概念。这个新的JEP Candidate可能会在Java 10中推出,提供了在定义的泛型类型中指定目标对象默认变异的方法,而不是在泛型...  变异、协变和逆变  以下的代

    Kotlin中协变、逆变和不变示例详解

    与Java相比,Kotlin的泛型处理方式更注重安全性,它提供了协变(Covariance)和逆变(Contravariance)的概念来解决类型兼容性问题。 **协变(Covariance)** 是指泛型类型参数的子类型关系被正确地传播到泛型实例...

    java编程语言英文第四版

    4. **语言新特性**:涵盖了从自动装箱、变长参数方法到增强的for循环和协变返回类型的全部新特性。 5. **新类覆盖**:介绍了如Formatter和Scanner等关键新类,这些类在处理格式化输出和输入方面极为有用。 本书系统...

    java150 toC#

    Java和C#都支持泛型,但C#的泛型更加灵活,可以有协变和逆变,而Java的泛型是不变的。 五、异步编程 1. Java 8引入了CompletableFuture,C#则从.NET Framework 4.5开始支持async/await关键词,两者都能实现异步...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    本代码资源是一个关于Java语言中泛型的讲解案例代码。通过使用实际的示例代码,详细讲解了泛型的定义、用法和优势。 适用人群: 有一定Java编程基础的开发者;对泛型概念感兴趣或希望加深理解的学习者。 使用场景...

    关于C#、java泛型的看法

    这意味着Java的泛型不支持协变和逆变,但可以通过通配符(如?)来放宽类型限制。Java的泛型约束则相对较少,主要通过extends和super关键字来限制类型参数的范围。 在实际应用中,C#的泛型在效率上可能具有优势,...

    java基础入门教程

    从 软 件的 设 计 风 格 、 设计 方 法 、 设 计 目 标 到 设 计 过 程 ,都 会 产 生 彻 底 的 变 革 ,"甚 至 会改 变 此 星 球 的 生活 方 式 "。 在 这 次 会 上 ,Java的 创 始 人 之 一 James Gosling 说 :...

    [Java泛型和集合].(Java.Generics.and.Collections).文字版

    6. **协变和逆变**:理解如何在泛型中实现类型参数的协变和逆变。 7. **比较和equals**:在泛型上下文中正确地实现Comparable和equals()方法。 8. **枚举类型与泛型**:结合使用枚举和泛型来增强类型安全。 通过...

    Java集合框架及泛型

    比如,List是List的子类型(协变),而List不是List的子类型(逆变)。 在实际开发中,理解和熟练运用Java集合框架和泛型能够大大提高代码的可维护性和安全性,减少类型转换的麻烦,并使得代码更易于理解和复用。...

    CSharpt ToJ ava Converter 22.4.20 完美版

    6. **泛型**:两种语言都支持泛型,但C#的泛型更灵活,允许协变和逆变,Java泛型则是非协变的。 7. **接口与抽象类**:Java只允许单继承,但可以多实现接口;C#允许单一的基类和多接口实现。转换时,需要根据具体...

    深入Java核心 Java中多态的实现机制编程资料

    5. **基类和派生类的方法的返回对象类型必须相同或者返回对象类型必须是协变的**:协变指的是如果子类可以替代父类,则子类类型也可以作为父类类型的返回值。 6. **派生类的方法的访问说明符不能比基类有更多的限制*...

    Java泛型_Java中的泛型结构_

    - 但是,泛型不支持协变(Covariance)和逆变(Contravariance),所以 `List&lt;Dog&gt;` 不是 `List&lt;Animal&gt;` 的子类型。 8. 类型推断(Type Inference): - 自Java 7起,编译器可以自动推断泛型的类型,例如在创建...

Global site tag (gtag.js) - Google Analytics