Почему мы имеем право при переопределении метода clone() писать его сигнатуру БЕЗ
"throws CloneNotSupportedException"
ведь в сигнатуре класса Object
protected native Object clone() throws CloneNotSupportedException
есть проброс исключений
Для примера возьмем класс ArrayDeque и посмотрим на реализацию этого метода в нем. Вы можете ответить - в переопределенном методе мы ловим исключения - НУ И ЧТО, есть же правила переопределения метода - СИГНАТУРА ДОЛЖНА СОВПАДАТЬ,за исключением возвращаемого типа(он может расшириться: protected->public) . А здесь мы берем и выкидываем "throws CloneNotSupportedException" из сигнатуры, почему?
public ArrayDeque<E> clone() {
try {
@SuppressWarnings("unchecked")
ArrayDeque<E> result = (ArrayDeque<E>) super.clone();
result.elements = Arrays.copyOf(elements, elements.length);
return result;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
А если мы возьмем еще какойто класс и отнаследуемся от ArrayDeque, то там мы тоже теряем эту сигнатуру
public static class C extends ArrayDeque {
public ArrayDeque clone() {
return super.clone();
}
}