2016-10-21 2 views
2

Поскольку статические функции принадлежат классу, они унаследованы, но не переопределены, просто скрыты. Из приведенного ниже кода кажется, что метод woof в B может иметь только объявление «throws IOException», если у него также есть родительский метод. I. приведенный ниже код дает ошибку компилятора, что предложение throws несовместимо с предложением в A.woof Если метод не переопределяется, почему он должен удовлетворять контракту на исключение?Если статические методы не могут быть переопределены, почему они должны удовлетворять исключению, то вызывает контракт статического метода в родительском?

class A { 
    static void woof() { //Compiles IF i add throws IOException here 
     System.out.println("A's woof"); 
    } 
} 

class B extends A { 
    static void woof() throws IOException { //Compiler error 
     System.out.println("B's woof"); 
    } 
+0

Стоит отметить, что компилятор говорит, что «переопределенный метод не бросает исключение IOException» *, а не * «скрытый метод не бросает IOException» *. – Gendarme

+0

Вы можете переопределить метод с меньшими исключениями, чем метод суперкласса, но вы не можете вводить новые. посмотрите [Принцип замены Лискова] (http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle) –

+0

@MadMatts LSP применяется к подтипированию; это не подтипирование. –

ответ

1

Это поведение было зафиксировано в спецификации JLS. Похоже, что методы переопределения и скрытия обрабатываются компилятором одинаково.

Более точно, предположим, что В представляет собой класс или интерфейс, и А представляет собой суперкласс или суперинтерфейс B и способ декларации м2 в B переопределениях или скрывает объявление метода m1 в А. Тогда:

Если m2 имеет предложение throws, в котором упоминаются все проверенные типы исключений, тогда m1 должен иметь предложение throws или возникнуть ошибка времени компиляции.

Для каждого проверяется типа исключения, перечисленный в бросках раздела м2, тот же класс исключения или один из его супертипов должен происходить в стирании (§4.6) из бросков раздела m1; в противном случае возникает ошибка времени компиляции .

Если unerased бросает раздел m1 не содержит супертипа каждого типа исключения в бросках раздела м2 (адаптированных, , если это необходимо, чтобы параметры типа М1), происходит во время компиляции бесконтрольно предупреждения ,

Смежные вопросы