Поскольку статические функции принадлежат классу, они унаследованы, но не переопределены, просто скрыты. Из приведенного ниже кода кажется, что метод 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");
}
Стоит отметить, что компилятор говорит, что «переопределенный метод не бросает исключение IOException» *, а не * «скрытый метод не бросает IOException» *. – Gendarme
Вы можете переопределить метод с меньшими исключениями, чем метод суперкласса, но вы не можете вводить новые. посмотрите [Принцип замены Лискова] (http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle) –
@MadMatts LSP применяется к подтипированию; это не подтипирование. –