0

我有一个名为 child 的子类,它继承了一个名为 parent 的类。我正在尝试覆盖超类中的方法。我做了一点实验。我创建了具有返回类型 short 的覆盖方法,它是 int 的子类型。据我所知,我可以这样做。并且该方法在法律上被覆盖。每当我使用超类的引用调用该方法时,编译器都会生成一个不兼容的返回类型错误。这里有什么问题?我的代码如下:

class parent
{

    int test()
    {
        System.out.println("called inside parent\n");
        return 1;
    }
}

class child extends parent
{

    short test()
    {
        System.out.println("called inside child\n");
        return 1;
    }
}

class Myclass
{

    public static void main(String[] args)
    {
        parent a=new child();
        a.test();
    }
}
4

5 回答 5

8

short 是 int 的子类型

错了,不是。的值范围short是 的子集int但这是一个完全不同的问题。一个short值确实可以转换为int甚至是隐式地),仍然 ashort 不是a int

原始类型不是常规类,因此它们不能具有超类型/子类型关系。因此,在这种情况下,您不能使用返回类型的逆变:一旦int在基方法中声明了返回类型,它的所有覆盖都必须返回int

于 2012-06-05T08:32:18.420 回答
1

我创建了具有返回类型 short 的覆盖方法,它是 int 的子类型。

不,short不是的子类型int(它不是这样int可以被视为的超类short)。

于 2012-06-05T08:32:33.250 回答
0

我认为您应该使用相同的签名来覆盖方法。

short test()

不同于

int test()

它不仅限于 Java。我认为这也适用于 C#。

于 2012-06-05T08:30:46.260 回答
0

您不能根据返回类型区分方法,除非返回类型中的类具有父子关系。即使在这种情况下,您也只能在覆盖的方法中向下转换。在 int & short 的情况下,它们是原始数据类型,不存在这种关系。

于 2012-06-05T08:37:47.397 回答
0

查看原始 Java 数据类型的文档

于 2012-06-05T08:44:12.640 回答