Является ли спецификация исключения частью подписи метода? Я имею в виду:
public void someMethod(String myString) throws IOException
является 'throws IOException' частью сигнатуры этого метода?
Спасибо
Является ли спецификация исключения частью подписи метода? Я имею в виду:
public void someMethod(String myString) throws IOException
является 'throws IOException' частью сигнатуры этого метода?
Спасибо
В ответ на ответ Jon Skeet и в ответ на комментарий
@Jon Skeet Почему тогда я не могу открыть public void run(), чтобы исключить IOException в классе, который реализует Runnable? - Знать, что я знаю тебя.
В разделе 8.4.6 Спецификации языка Java (3-е изд.) говорится:
Метод, который переопределяет или скрывает другой метод (раздел 8.4.8), включая методы, реализующие методы
abstract
, определенные в интерфейсах, не может быть объявлен для того, чтобы выдавать больше проверенных исключений, чем переопределенный или скрытый метод.Более точно, предположим, что B является классом или интерфейсом, а A является суперклассом или суперинтерфейсом B, а декларация метода n в B переопределяет или скрывает объявление метода m в A. Если n имеет предложение
throws
в котором упоминаются все проверенные типы исключений, тогда m должно иметь предложениеthrows
, и для каждого проверенного типа исключения, указанного в предложенииthrows
n, тот же класс исключения или один из его супертипов должен произойти при стиранииthrows
положение m; в противном случае возникает ошибка времени компиляции.
Здесь речь идет не о сигнатуре метода, а о том, чтобы не требовать от вызывающих абонентов учитывать исключения, которые не должны проверяться методом "оригинала", который они вызывают.
Нет. Из раздел 8.4.2 Специфика языка Java:
Два метода имеют одну и ту же подпись, если они имеют одно и то же имя и аргумент типы.
Два объявления метода или конструктора M и N имеют одинаковые типы аргументов если все следующие условия держать:
Они имеют одинаковое количество формальных параметры (возможно, ноль). такое же количество параметров типа (возможно, ноль). Пусть формальные параметры типа M и пусть быть формальным типом параметры N. После переименования каждого появление Bi в N-типе Ai границы соответствующего типа переменные и типы аргументов M и N одинаковы.
Итак, два метода с тем же именем и аргументами, но с разными объявленными исключениями, они имеют одинаковую подпись.
Кроме того, из документ Божо цитирует:
Определение: две составляющие описание метода включает метод подпись - имя метода и типы параметров.
Нет упоминаний об исключениях...
EDIT: Что касается переопределения метода (или реализации интерфейса), из раздел 8.4.8.3:
Объявление метода не должно иметь бросает условие, что конфликты (§8.4.6) с любым способом, который он переопределяет или скрывает; в противном случае ошибка времени компиляции.