协变返回值类型

科技工作者之家 2020-11-17

在面向对象的编程中,方法的协变返回类型是在子类中重写方法时可以用“较窄”类型替换的类型。 一种值得注意的语言是C ++,这是一种相当普遍的范例。

C#不支持返回类型协方差。 自JDK5.0发布以来,Java语言已经(部分)允许协变返回类型,[1]因此以下示例无法在先前版本上进行编译:

// Classes used as return types: class A { } class B extends A { } // "Class B is more narrow than class A" // Classes demonstrating method overriding: class C { A getFoo() { return new A(); } } class D extends C {//Overriding getFoo() in parent class C B getFoo() { return new B(); } }更具体地说,协变(从宽到窄)或逆变(从窄到宽)返回类型是指将覆盖方法的返回类型改变为与原始重写方法的返回类型相关(但不同)的类型的情况。。 两个协变返回类型之间的关系通常是允许用Liskov替换原则替换另一个类型的关系1。 这通常意味着重写方法的返回类型将是重写方法的返回类型的子类型。 上面的例子具体说明了这种情况。 如果不允许替换,则返回类型是不变的并导致编译错误。

本词条内容贡献者为:

王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。