0

parentという名前のクラスを継承するchildという名前のサブクラスがあります。スーパークラスのメソッドをオーバーライドしようとしています。少し実験しました。intのサブタイプであるreturntypeshortを使用してオーバーライドされたメソッドを作成しました。私が知っている限り、私はそうすることができます。そして、メソッドは法的にオーバーライドされます。スーパークラスの参照を使用してメソッドを呼び出すと、コンパイラは互換性のない戻り型エラーを生成します。ここでの問題は何ですか?私のコードを以下に示します。

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

intのサブタイプであるshort

間違っています、そうではありません。の値の範囲shortはのサブセットですがint、これはまったく別の問題です。short値は実際に(暗黙的にでも)に変換できますが、それでもaはではありませんintshort int

プリミティブ型は通常のクラスではないため、スーパータイプとサブタイプの関係を持つことはできません。したがって、この場合、戻り型の共変性を使用することはできません。int基本メソッドで戻り型を宣言すると、そのすべてのオーバーライドはを返す必要がありますint

于 2012-06-05T08:32:18.420 に答える
1

intのサブタイプであるreturntypeshortを使用してオーバーライドされたメソッドを作成しました。

いいえ、shortのサブタイプではありませんintintのスーパークラスと見なすことができるようにはなりません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 に答える