`
anrynlee
  • 浏览: 13547 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
  • zczh3: N多年前 已经很多人讨论N遍:JAVA 与 C 只存在 传值, ...
    传引用

协变返回类型

    博客分类:
  • J2SE
阅读更多
听起来陌生的词语,其实不算陌生。
用一个例子就可以稍稍了解了。
public class Demo {
	public static void main(String[] args) {
		A a = new B();
		
		C c = a.display() ;
		c.display() ;
		
	}
}

class A {
	public C display() {
		System.out.println("this is from A!");
		return new C();
	}
}

class B extends A {
	public D display() {
		System.out.println("this is from B!");
		return new D() ;
	}
}

class C {
	public void display() {
		System.out.println("this is from C!!!"); 
	}
}

class D extends C {
	public void display() {
		System.out.println("this is from D!!!");
	}
}

这个是可以编译通过的。

D继承C重写了display()方法,返回的都是void类型。
B继承A,都写了display()方法,但是类型看似乎不一样,一个返回的是类C,一个是继承了类C的类D,这里就是协变返回了。

输出的结果为:
this is from B!
this is from D!!!


分享到:
评论

相关推荐

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

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

    JAVA可变(协变)返回类型

    本文将深入探讨这个主题,并结合提供的`Test.java`文件,来理解如何在实际编程中应用协变返回类型。 首先,我们要明白什么是协变(Covariance)。在面向对象编程中,协变是指子类型可以被当作父类型来使用。例如,...

    java协变返回类型使用示例

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

    Covariant-Return-Types-and-Smart-Pointers:协变返回类型和智能指针

    协变返回类型和智能指针 协变返回类型是一种语言功能,它允许您将虚函数的返回类型更改为协变类型,即。 指向派生类的指针而不是指向基类的指针 - 请参见下面的示例: struct Figure { virtual ~Figure () = ...

    理解C#中的协变和逆变

    当一个方法或委托只读取(不修改)参数类型的实例时,允许将该方法或委托的返回类型向上转型为它的基类型。例如,如果你有一个返回`IEnumerable<Animal>`的方法,而实际上它返回的是`IEnumerable<Cat>`,协变性允许...

    aspectj_in_action_second_edition

    自第一版以来,AspectJ已经取得了显著的发展和完善,本书涵盖了AspectJ最新的功能和改进,包括对Java注解的支持、泛型的支持以及对可变参数列表和协变返回类型的支持等。本书由AspectJ领域的专家Ramnivas Laddad撰写...

    Java1.5泛型指南

    协变返回类型允许子类覆盖父类的方法时,返回类型可以是父类返回类型的子类型,这在泛型上下文中尤为重要,能够保持代码的灵活性和类型安全性。 #### 六、泛型的实际应用与注意事项 在实际编程中,合理运用泛型...

    The Java Programming Language 4th Edition

    此外,书中还新增了断言和正则表达式的重要部分,涵盖了自动装箱、可变参数方法、增强型for循环和协变返回类型等所有新的语言特性。同时,本书也对Formatter和Scanner等关键新类进行了介绍。 《Java编程语言 第四版...

    南理工java课程设计课件

    自Java 1.5起,接口方法的改写允许返回类型更加宽松,即子接口或实现类的方法返回类型可以是父接口方法返回类型的子类型,这是协变返回类型(covariant return type)。然而,如果方法的返回类型仅仅是不同的,那么...

    Java重载.docx

    从Java 7开始,子类方法的返回类型可以是父类返回类型的派生类,这称为协变返回类型。 3. **访问修饰符**:重写方法的访问权限不能低于被重写方法。比如,如果父类方法是`public`,子类重写方法不能声明为`...

    理学继承接口与泛型PPT课件.pptx

    - Java 5.0以后,返回类型可以是父类类型的任何子类,这被称为协变返回类型。 5. **super关键字**: - `super`关键字用于引用父类的成员,包括变量和方法。 - 在构造方法中,`super(参数列表)`用于调用父类的...

    7里氏替换原则-课程内容.rar

    1. **协变返回类型**:子类型的方法返回了一个比基类型更具体的类型,这可能会导致类型安全问题。 2. **逆变参数类型**:子类型的方法接受一个比基类型更泛化的参数,这可能导致方法无法正确处理某些子类型的实例。 ...

    The Java Programming Language.4th.Edition.Aug.2005.pdf

    - **协变返回类型(Covariant Return Types)**:这种方法允许子类重写父类的方法并改变其返回值的类型,但必须确保子类的返回类型是父类返回类型的子类型。 ##### 3. 新增的关键类 - **Formatter类**:提供了格式...

    C#协变逆变

    首先,协变是指在派生类和基类之间,方法返回类型可以安全地向上转型。这意味着,如果一个方法声明返回类型为基类,而实际上返回的是派生类的实例,这样的转换是允许的。在泛型中,这主要适用于只读操作或输出类型的...

    重载、覆盖、多态与函数隐藏

    子类的这个方法必须与父类方法有相同的名称、参数列表和返回类型(C++中返回类型必须相同,而C#等语言允许协变返回类型)。覆盖的目的是改变父类方法的行为,以实现更具体的功能。在运行时,根据对象的实际类型调用...

    泛型JAVA指南.pdf

    泛型的协变返回类型(Covariant Return Types)允许子类重写方法时返回比父类更具体的类型。 通过对比Java泛型和C++模板(Templates),我们可以看到两者在设计上有相似之处,但也有本质的区别。Java的泛型提供了比...

    java面试题.pdf

    重写(Override)是指子类对父类中的方法进行重新实现,必须保证子类方法与父类方法具有相同的名称、参数列表和返回类型(协变返回类型除外)。重写体现运行时多态,与访问权限和抛出的异常也有关。重载与返回类型...

    java编程语言英文第四版

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

    SCJP各章要点02

    从Java 5开始,子类的重写方法还可以拥有更具体的返回类型,这种特性被称为协变返回类型。 - **重载(Overload)**:则是在同一个类中,使用相同的方法名但参数列表不同的多个方法。重载方法的访问修饰符、抛出的异常...

Global site tag (gtag.js) - Google Analytics