В Java вы не можете указать, что переопределенный абстрактный метод throws
создает некоторое исключение, если исходный абстрактный метод этого не делает (overridden method does not throw Exception
). Однако в Scala вы можете сделать это, поскольку в нем нет проверенных исключений. Хорошо, но если вы используете аннотацию @throws
, это должно подсказать компилятору Java, что происходит, верно?
Учитывая этот код Scala:
package myscala
abstract class SFoo {
def bar(): Unit
}
class SFoobar extends SFoo {
@throws[Exception]
override def bar(): Unit = {
throw new Exception("hi there")
}
}
У меня есть две разные Java-программы, одна из которых будет компилироваться и запускаться в Exception
во время выполнения, а другая не будет компилироваться.
Компилирует:
import myscala.SFoo;
import myscala.SFoobar;
public class Foobar {
public static void main(String[] args) {
SFoo mySFoo = new SFoobar();
mySFoo.bar();
}
}
Не компилируется (unreported exception Exception; must be caught or declared to be thrown
):
import myscala.SFoo;
import myscala.SFoobar;
public class Foobar {
public static void main(String[] args) {
SFoobar mySFoo = new SFoobar(); // only difference is the declared type
mySFoo.bar();
}
}
Я действительно не понимаю. Почему компилятор Java не улавливает тот факт, что я объявляю, что SFoobar.bar
выдает исключение, даже если Foo.bar
не имеет такого объявления, и в результате вызывает аналогичную ошибку компиляции?