`

Java中的协变

阅读更多
java中的协变表现为三方面:

1. 对于自定义对象的数组,可以将子类的数组直接转化为父类的数组。
如:
       
        ConcreteUser2[] userArray = new ConcreteUser2[]{};
	UserParent[] parents = new UserParent[]{};
	parents = userArray;
        


2. 可以在子类中重写父类的返回父类类型的方法,子类返回的是子类的类型。
如:
      
       public class UserParent {
		public UserParent getUser()
		{
			System.out.println("parent");
			return new UserParent();
		}	
	}
	public class ConcreteUser extends UserParent {
		public ConcreteUser getUser()
		{
			System.out.println("child");
			return new ConcreteUser2();
		}
	}
       

注:在一般的方法中,如果一个类中定义了两个方法,这两个方法的参数个数和类型
都相同,仅仅是返回类型不同的话,是不被允许的。因为这样算是重复的方法,不算
是方法的重写或重载。
但是对于继承关系的类,则属于协变。即凡是子类出现的地方都可以被父类取代。
3. 在泛型中,像1那种情况是不允许的。只能手动转换
       
        List<ConcreteUser2> childList = new ArrayList<ConcreteUser2>();
	List<UserParent> parentList = new ArrayList<UserParent>();
	parentList = childList;(错误)
        


分享到:
评论

相关推荐

    JAVA可变(协变)返回类型

    NULL 博文链接:https://capricorn-lu.iteye.com/blog/2348956

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

    数组的协变性来源于数组的一个优势,这篇文章主要给大家介绍了关于Java中数组协变和范型不变性踩坑的一些内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来...

    C#逆变与协变详解

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

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

    super T&gt; 通配符型变约束,而是采用类似 C# 的 in,out 用于支持协变和逆变,这同时避免了处理子类型化,父类化的问题(即Java泛型中典型的List&lt;T&gt; 不是 List&lt;Object&gt;的子类型的问题); 基本的泛型语法可以...

    java基础入门教程

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

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

    java学习资料/笔记整理,含JavaTutorial、Java编程思想、Java编程语言中的类型协变、JAVA快速查询手册、Java数据结构与算法等pdf文档

    java协变返回类型使用示例

    在面向对象程序设计中,协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更"狭窄"的类型

    新JEP将简化Java类型变异

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

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

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

    JAVA 范例大全 光盘 资源

    实例96 方法改变(协变式返回类型) 251 实例97 静态导入 252 实例98 动物搭配(泛型) 253 实例99 人员信息(枚举类型) 256 实例100 printf()用法 260 实例101 使用ProcessBuilder调用外部命令 263 实例102 ...

    java泛型讲解

    全面简介java中的泛型使用方法,和“协变”的内容!

    java采购管理系统源码-retrotranslator:Retrotranslator是使Java应用程序兼容Java1.4、Java1.3

    协变返回类型 格式化输出 静态导入 并发实用程序 集合框架增强 下载 () 并解压二进制分发文件Retrotranslator-_n.n.n_-bin.zip ,其中nnn是最新的 Retrotranslator 版本号。 使用 Java 5.0 或 Java 6 编译您的类并将...

    你真的懂Java泛型吗?

    泛型实现 参数化类型 的概念,使代码可以应用于多种...  泛型不支持协变  什么是协变?举个例子。  class Fruit{}  class Apple extends Fruit{}  Fruit[] fruit = new Apple[10]; // OK  子类数组可以赋

    JAVA资格认证:SCJP310-055中文

    第一部分:声明、初始化、和作用域。  定义类、内部类、静态类、接口、枚举。...正确重写和重载方法并识别方法合法的返回值,包括协变返回。  为类及层次类编写构造函数,知道默认构造函数的行为,实例化类及内部类

    戴尔java培训笔试题-Exams:口试和考试材料的收集

    解释具有通用多态性的语言中协变和逆变的概念(用书面例子),并解释在什么情况下它们的使用是安全的 解释控制反转和依赖注入 什么是 Haskell 中的惰性评估并解释 IO Monads 的精神 学生选择的主题:Java 中的 ...

    Java泛型学习1

    (调用的是泛型方法)泛型与数组(只有可具体化类型可以创建数组):数组是协变类型 String数组是Object数组的字类型 但是对于list而言,则不是什么是方

    java二八杠源码-java-II-notes:java-II-notes

    返回类型相同或协变 使用 @Overrride 注释的好习惯 解析多个继承方法的规则: 实例方法优于接口默认方法 已经被其他候选者覆盖的方法将被忽略。 您不能使用实例/静态方法覆盖静态/实例方法。 命名约定:小写或驼峰式...

    java课程资源第七章

    多态(polymorphism) “多态”理解 再论向上转型 多态内部机制 正确使用,私有、静态方法及域与多态关系 构造器-多态 协变的返回类型(Covariant return types) 用继承进行设计(纯继承与扩展、向下转型)

    Java-Generics-and-Collections-2:Java Generics and Collections Java泛型和集合

    3.8 协变覆盖 第四章(声明) 4.1 构造函数 4.2 静态成员 4.3 嵌套类 4.4 擦除的工作原理 第五章(进化,而不是革命) 5.1 旧版客户端的旧版库 5.2 具有通用客户端的通用库 5.3 具有传统客户端的通用库 5.4 具有通用...

Global site tag (gtag.js) - Google Analytics