Объяснение методов моста
Если я делаю переопределение метода клонирования, компилятор создает метод моста, чтобы гарантировать правильный полиморфизм (ЭТО КЛАСС ОТКРЫТ)
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 не включают возвращаемый тип... и вы не можете иметь дубликаты сигнатур методов.