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

java中的协变

    博客分类:
  • java
阅读更多

一个一直有点模糊的概念,记录一下,协变是指一个类型随着它关联的类型一起变化,有点抽像,java中体现协变的包括两点:


1.数组


如果 A 是 B 的超类,则 A[] 也是 B[] 的超类,所有需要 A[] 的地方都可以用 B[] 代替。

 

public class Test2 {
    public static void main(String[] args){
        Integer[] ints=new Integer[1];
        ints[0]=99;
        show(ints);
    }
    static void show(Number[] ns){
        System.out.println(Arrays.toString(ns));
    }
}

 

2.override


允许 子类的覆盖父类函数的返回类型 是 父类被覆盖函数返回类型 的子类

 

public class Test2 {
    public static void main(String[] args){
        P p=new C();
        System.out.println(p.get());
    }
}

class P{
    public Number get(){
        return new Integer(0);
    }
}

class C extends P{
    public Integer get(){
        return new Integer(1);
    }
}

 

3.范型不能协变


如果 A 是 B 的超类,则 List<A> 和 List<B> 无关,需要 List<A> 的地方不可以用 List<B> 代替。

 

public class Test2 {
    public static void main(String[] args) {
        List<Integer> ints = new ArrayList<Integer>();
        //incompatible type
        show(ints);
    }

    static void show(List<Number> ns) {
        System.out.println(ns);
    }
}

 

参考:


 

类型,转换,数组,协变及其他

 

 

分享到:
评论
1 楼 hetor 2013-08-03  
写的不错,学习了

相关推荐

    JAVA可变(协变)返回类型

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

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

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

    java协变返回类型使用示例

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

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

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

    C#逆变与协变详解

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

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

    在提供的"dotnet 5 从 IL 层面分析协变返回类型新特性.md"文档中,详细探讨了一个具体的案例,通过ILDASM工具查看生成的IL代码,深入理解协变返回类型在实际代码中的体现和作用。这个文档可以帮助开发者直观地理解...

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

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

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

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

    Java泛型_Java中的泛型结构_

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

    java基础入门教程

    香 港 则 在 今 年 4月 就 举 行 了 全 岛 的 Java杯 比 赛 ,在 计 算 机界掀 起 了 学 习 Java的热 潮 (尤 其 是 在 大 学 生 们 中 ,出 现 了 一 批 Java迷 )。 有 人 预 言 :Java将 是 网 络 上 的 "世 界 语 ...

    java150 toC#

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

    the java programming language fourth editionArnoldGoslingHolmes06

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

    新JEP将简化Java类型变异

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

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

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

    java编程语言英文第四版

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

    关于C#、java泛型的看法

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

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

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

    java泛型的内部原理及更深应用

    3. **泛型的协变与逆变**:在Java中,泛型默认是不变的,即`List&lt;String&gt;`不能赋值给`List&lt;Object&gt;`。但是,通过使用通配符,我们可以实现协变(如`List&lt;? extends Number&gt;`可以赋值给`List&lt;Number&gt;`)和逆变(如`...

    Java集合框架及泛型

    5. **协变与逆变**: 在泛型中,类型参数的使用会影响类型安全。比如,List是List的子类型(协变),而List不是List的子类型(逆变)。 在实际开发中,理解和熟练运用Java集合框架和泛型能够大大提高代码的可维护性...

    深入Java核心Java中多态的实现机制.pdf

    返回类型必须相同,或者返回对象类型是协变的。派生类的方法访问说明符不能比基类更严格。 2. **强制多态**: - 强制多态是指编译器自动进行类型转换,以适应操作或方法调用。例如,当不同类型的数据进行运算时,...

Global site tag (gtag.js) - Google Analytics