子类作为父类的返回类型

时间:2019-04-20 10:15:31

标签: java

Test类中,Object类与show方法一起使用。如果我们使用Object类的show方法编写xyz,那将是错误的。我在这里感到困惑,因为Object是所有类的父类。可以在任何地方使用吗。

class Test{
        Object show(){
        System.out.println("1");
        }
    }
    class xyz extends Test{
        String show(){
        System.out.println("2");
        }
    }


如果我将上面的代码写为

class Test{
        String show(){
        System.out.println("1");
        }
    }
    class xyz extends Test{
        Object show(){
        System.out.println("2");
        }
    }


如果Object拥有所有类,或者Object是所有类的parent类,那么在哪里使用它有关系吗?

1 个答案:

答案 0 :(得分:1)

从Java 5开始,方法覆盖允许 co-variant 返回类型,这意味着子类的覆盖方法可以返回更特定但仍可分配给父方法返回类型的类型。

在这种情况下,由于父方法正在返回Object,因此子方法实际上可以返回String,它是Object的子类并且可以分配给它。

来自JLS specs

  

如果返回的类型彼此不同,返回类型可能会有所不同。   返回类型是引用类型。的概念   return-type-substitutability支持协变收益,即   将返回类型特化为子类型。

如果您在父类方法中使用CharSequence尝试此操作,并在子类方法中说一个Integer,则它将不会编译:

class Test{
    CharSequence show(){
        System.out.println("1");
        return null;
    }
}
class xyz extends Test{
    Integer show(){  //won't compile
        System.out.println("2");
        return null;
    }
}

但是将Integer替换为String,它将在String实现时编译/是CharSequence的一种类型:

class Test{
    CharSequence show(){
        System.out.println("1");
        return null;
    }
}
class xyz extends Test{
    String show(){
        System.out.println("2");
        return null;
    }
}