Объяснение методов моста

Если я делаю переопределение метода клонирования, компилятор создает метод моста, чтобы гарантировать правильный полиморфизм (ЭТО КЛАСС ОТКРЫТ)

class Point
{

    Point()
    {
    }

    protected Point clone()
        throws CloneNotSupportedException
    {
        return this; // not good only for example!!!
    }

    protected volatile Object clone()
        throws CloneNotSupportedException
    {
        return clone();
    }
}

поэтому, когда вызывается метод клонирования, вызывается метод моста и внутри него вызывается правильный метод клонирования. Но мой вопрос, когда в метод моста называется return clone() как ВМ сказать, что она должна вызывать Point clone() а не сама опять???

2 ответа

Вы не можете этого сделать, он не скомпилируется, потому что у вас есть два метода с одинаковым именем и одинаковыми параметрами (в данном случае ни одного), и если вы вызываете somePoint.clone() не ясно, какой из них имеется в виду.

Вы должны сделать что-то вроде:

public Point clone() {
    return (Point) super.clone(); // shallow copy
}

Редактирование: некоторые тонкости: ваш класс должен реализовывать клонируемый интерфейс, иначе super.clone () выдаст исключение. Метод clone () в классе Object возвращает поверхностную копию текущего объекта (его класс времени выполнения будет таким же, как у объекта, для которого был вызван метод clone). Тогда ваша задача - выполнить какие-либо специфические для класса манипуляции с этим объектом (например, клонировать ссылки на другие объекты) и затем вернуть его. Тип возвращаемого значения может быть вашим собственным классом вместо Object, и он все равно будет перезаписывать Object.clone () (или любой другой метод ParentClass.clone()).

Этот код не компилируется с Java 1.6. Сигнатуры методов в Java не включают возвращаемый тип... и вы не можете иметь дубликаты сигнатур методов.

Другие вопросы по тегам