20

Java では、次のコードのように、関数の戻り値の型を指定することが許可されています。

public class Test {

    static class Dad {
        Dad me() {
            return this;
        }
    }

    static class Son extends Dad {
        Son me() {
            return this;
        }
    }
 }

有効です。

ArrayListクラスを見てみましょう。オーバーライドされclone()た機能があります(少なくともOracle jdk 1.7ソースで確認できます)

public Object clone() {
    try {
        @SuppressWarnings("unchecked")
            ArrayList<E> v = (ArrayList<E>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError();
    }
}

返さないポイントは何ArrayList<E>ですかObject

4

2 に答える 2

15

下位互換性。

Java 5 より前では、オーバーライド時に戻り値の型を絞り込むことができなかったため、ArrayList.clone()return と宣言されていましたObject。言語で許可されているため、使用できません。戻り値の型を狭めると、戻り値の型でオーバーライドされるArrayList.clone()ArrayList の既存のサブクラスが壊れてしまうためです。ArrayList.clone()Object

于 2013-07-07T06:00:10.777 に答える
11

理由の 1 つは下位互換性です。メソッドのシグネチャは、Object.clone()共変の戻り値の型がサポートされていなかった Java 1.0 で指定されました。あなたが提案したように彼らがこの基本的なメソッドを変更した場合、clone()メソッドが と同じ型のオブジェクトを返さない可能性がある何千ものレガシープログラムが壊れる可能性がありますthis

以下も参照してください。

于 2013-07-07T05:57:06.843 に答える