为了账号安全,请及时绑定邮箱和手机立即绑定

重写的方法在返回类型上会有所不同吗?

重写的方法在返回类型上会有所不同吗?

holdtom 2019-07-17 09:43:45
重写的方法在返回类型上会有所不同吗?是否可以重写方法不同返回类型?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

Java支持*重写方法的协变量返回类型。这意味着重写的方法可能具有更多特定的返回类型。也就是说,只要新的返回类型可以分配给要重写的方法的返回类型,就允许这样做。

例如:

class ShapeBuilder {
    ...
    public Shape build() {
    ....}class CircleBuilder extends ShapeBuilder{
    ...
    @Override
    public Circle build() {
    ....}

这是在Java语言规范第8.4.5节:

如果返回类型是引用类型,则返回类型可能因重写方法而异。返回类型可替换性的概念支持协变量返回,即返回类型对子类型的专门化。

具有返回类型R1的方法声明D1是返回类型R2的另一个方法D2的返回类型替换,当且仅当以下条件保持:

  • 如果R1为空,则R2为空。

  • 如果R1是原语类型,则R2与R1相同。

  • 如果R1是一个参考类型,那么:

    • R1是R2的子类型,也可以通过未经检查的转换将R1转换为R2的子类型(第5.1.9节),或

    • R1=\x{e76f}

中定义的r2的擦除。第4.6条.)


*在Java 5之前,Java有不变量返回类型,这意味着与被重写的方法完全匹配所需的方法重写的返回类型。


查看完整回答
反对 回复 2019-07-17
?
开满天机

TA贡献1786条经验 获得超13个赞

是的,它可能有所不同,但它们有一些局限性。

在Java5.0之前,当您重写一个方法时,参数和返回类型都必须完全匹配。在Java5.0中,它引入了一个名为协变量返回类型的新工具。可以重写具有相同签名的方法,但返回的对象的子类。换句话说,子类中的方法可以返回一个对象,该对象的类型是该方法返回的类型的子类,在超类中具有相同的签名。


查看完整回答
反对 回复 2019-07-17
?
当年话下

TA贡献1890条经验 获得超9个赞

是的,如果他们返回一个子类型。下面是一个例子:

package com.sandbox;public class Sandbox {

    private static class Parent {
        public ParentReturnType run() {
            return new ParentReturnType();
        }
    }

    private static class ParentReturnType {

    }

    private static class Child extends Parent {
        @Override
        public ChildReturnType run() {
            return new ChildReturnType();
        }
    }

    private static class ChildReturnType extends ParentReturnType {
    }}

此代码编译并运行。


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 983 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信