首页 > 解决方案 > 子类作为父类的返回类型

问题描述

TestObject中与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所有类的类,那么我们在哪里使用它有关系吗?

标签: java

解决方案


从 Java 5 开始,方法覆盖允许协变返回类型,这意味着子类的覆盖方法可以返回更具体但仍可分配给父方法返回类型的类型。

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

JLS 规格

如果返回类型是引用类型,则返回类型可能会因相互覆盖的方法而异。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;
    }
}

但是用它替换IntegerString会编译为Stringimplements / 是一种CharSequence

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

推荐阅读