Я отвечу ужасным, нарисованным рукой комиком. Второе изображение является причиной того, что result
является undefined
в вашем примере кода.
Это конкретное предложение книги кажется неправильным.
blockquote>Таким образом, в этом случае, совместимым с обеими декларациями, было бы
@Override public void x() { }
. В обеих декларациях были общие исключения, которые они могли включить в декларацию.
interface I1 { public void x() throws I1Exception, I2Exception; } interface I2 { public void x() throws I2Exception; }
then
@Override public void x() throws I2Exception { }
Или, альтернативно, в вашем примере, если у вас есть что-то вроде
class I1Exception extends I2Exception { } class I2Exception extends Exception { }
Тогда можно было бы написать декларацию совместимого метода как
@Override public void x() throws I1Exception { }
Ошибка имеет два метода в одном классе с тем же именем, которые не имеют параметров. В java у вас могут быть разные методы с тем же именем, только если они получают разные параметры: например
public int i (int a);
public int i ();
После второй мысли, я думаю, что намерение книги состояло в том, чтобы сказать, что вы должны одновременно выполнять оба интерфейса.
Таким образом, метод должен бросить (грубо говоря) пересечение наборов исключений обоих методов. Если эти множества не пересекаются, то метод ничего не может выбросить. Итак, это:
@Override
public void x() {
}
ОК для обоих интерфейсов.
(Это немного сложнее из-за наследования, но вы получаете идею.)
Итак, с моей точки зрения
", если метод объявлен в 2 или более интерфейсах, и если этот метод объявляет, что он бросает разные исключения в предложении throws, реализация должна перечислять все эти исключения" (стр. 347)
blockquote>не может быть правильным, потому что это не работает на практике. Вы (в большинстве случаев) не можете перечислить все эти исключения в реализации. Существуют исключения, такие как непроверенные исключения или идентичные / совместимые наборы исключений.
Однако я не мог найти нормативную ссылку в JLS для этого.
Я думаю, что в книге говорится, что вы можете выбрать, какой метод вы хотите реализовать, но не можете реализовать оба из них (не пробовал, но так я понял бы это).
the implementation should list all these exceptions
, вероятно, означает все исключения, которые один метод объявляет в предложении throws
.
Множество проверенных исключений, которые может быть выбрано методом метода, - это пересечение наборов проверенных исключений, которые, как объявлено, будут выбраны всеми применимыми типами, а не объединением. В результате объект x () на объекте вообще не может выбрасывать любые проверенные исключения и разрешен.
blockquote>@Override public void x() { }
Он иллюстрирует взаимодействие множественных унаследованных предложений бросков, что уменьшает а не увеличивает количество исключений, которые может быть разрешено методом. Это обычно не вызывает тонких ошибок, но они могут быть немного удивителен в первый раз, когда вы их увидите.